• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

JNI - library path - link error

 
Saidul Islam
Greenhorn
Posts: 18
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi everyone-
I am trying to run this simple app that uses a native method. Everthing is created and compiled fine.
I compiled the my .java.
I created the .h
I created my .cpp
I created my .so
So, everything is cool. I run my app like...
java myjavaapp
and it gives me
Exception in thread "main" java.lang.UnsatisfiedLinkError: no dispname in java.library.path
ok so I set my $LD_LIBRARY_PATH and exported it. and I still get the same thing.
what am i missing?
thanks
 
Melissa Aron
Greenhorn
Posts: 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I cant really help you, because I am having the same issue as you...but maybe we can work together to figure out the problem. I am trying something pretty similar to what you are doing. What I have found though is that when I create my .cpp, if I use C commands, ie. printf, I compile, and run perfectly. However, if I substitute "cout" in place of the printf, I suddenly go back to the UnsatisfiedLink error.
Could this mean that I for whatever reason am not linking properly to standard C++ libraries? I am including the appropriate header files, and I can run a similar application from command line, just not via my java class... Anybody, HELP!
 
Saidul Islam
Greenhorn
Posts: 18
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
well...
in my case, it doesn't matter what I try, either C (.c) or C++ (.cpp), I still get the same error

Here is my small hello world kind java app
-----------------------
//DisplayName.java
public class DisplayName {
public native void display();
static {
System.out.println("gets here2");
System.out.println(System.getProperty("java.library.path"));
try {
System.loadLibrary("libdispname.so");
}
catch (UnsatisfiedLinkError e) {
System.out.println("Error: " + e.getMessage());
}
} //End of static block
public static void main(String[] args) {
System.out.println("gets here1");
new DisplayName().display();
} //End of my main method
} //End of DisplayName class
----------------------------------

Here is my DisplayName.h
-------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DisplayName */
#ifndef _Included_DisplayName
#define _Included_DisplayName
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DisplayName
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_DisplayName_display
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------------------------------
Here is my dispname.cpp
----------------------------------------------------
#include <jni.h>
#include "DisplayName.h"
#include <iostream.h>
JNIEXPORT void JNICALL Java_DisplayName_display(JNIEnv *env, jobject obj)
{
cout << "Hello Saidul!";<br /> return;<br /> }<br /> --------------------------------------------------------------<br /> this is how I am trying to make the .so<br /> sislam@w2/javaexpm/jni> CC -G -I/usr/java1.2/include -I/usr/java1.2/include/solaris dispname.cpp -o libdispname.so<br /> <br /> it creates the libdispname.so fine<br /> when I run<br /> sislam@w2/javaexpm/jni> java DisplayName
i get the following
gets here2
/usr/java1.2/bin/../jre/bin/../lib/sparc:/export/home/sislam/javaexpm/jni:/usr/l
ib
Error: no libdispname.so in java.library.path
gets here1
Exception in thread "main" java.lang.UnsatisfiedLinkError: display
at DisplayName.main(DisplayName.java:19)
 
Sudharsan Govindarajan
Ranch Hand
Posts: 319
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
One more addition to the JNI victims list. I get the same error. But I dont use any C++ specific calls. I replaced te System.loadLibrary("my.dll") function with the System.load("absPath\my.dll") and it worked. But the Exception is now thrown when I try to access a native method.
Any solutions found?
 
Madhusudhan Srinivasan
Greenhorn
Posts: 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hello,
One possible solution. I think you dont need to specify .so or .dll in the System.loadLibrary method call. i.e, all you have to do in the static block is

And also, your java code will remain independent of the platform.
Hope this helps.
Madhusudhan.
 
Sudharsan Govindarajan
Ranch Hand
Posts: 319
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
yeah! I have done that. The actual problem in accessing the native method was due to copy /paste. This code was present in the implementation file.
So, it generated the lib but without any functions.
Anyway, thanks for ur suggestion madhu!
-sudharsan
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic