JNI的Java运行时错误

时间:2010-10-07 14:57:35

标签: java java-native-interface runtime-error

我正在尝试构建并运行一个示例jni程序。该计划只是一个示例helloworld计划。我没有写它,但我认为它有效。我在Linux上运行它。有四个文件。

HelloNative.c  
HelloNative.h  
HelloNative.java  
HelloNativeTest.java  

要构建文件,我做了

gcc -I/myDir/jdk/include -I/myDir/jdk/include/linux -fPIC -c HelloNative.c  
gcc -shared -o HelloNative.so HelloNative.o  
java *java

以下是构建

的结果
HelloNative.c  
HelloNative.h  
     HelloNative.o  
   HelloNativeTest.class  
HelloNative.class  
HelloNative.java  
HelloNative.so  
HelloNativeTest.java

然后我做了

setenv LD_LIBRARY_PATH /myDir/myExample:${LD_LIBRARY_PATH}  
java HelloNativeTest

我收到以下错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path  
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)  
        at java.lang.Runtime.loadLibrary0(Runtime.java:823)  
        at java.lang.System.loadLibrary(System.java:1028)  
        at HelloNative.<clinit>(HelloNative.java:9)  
        at HelloNativeTest.main(HelloNativeTest.java:8)  

我检查了LD_LIBRARY_PATH以及HelloClassTestHelloNative.so,他们都在那里。我也尝试指定-CLASSPATH,但这似乎并不重要。 有没有人有任何想法?

3 个答案:

答案 0 :(得分:0)

您也可以尝试设置java.library.path

java -Djava.library.path=/myDir/myExample HelloNativeTest

答案 1 :(得分:0)

你是从Java做过System.loadLibrary()吗?

答案 2 :(得分:0)

执行以下操作,其中X =“HelloNative”。

  • 根据系统相关标准为库提供文件名。在Linux上,为您的库命名libX.so
  • java.library.path系统属性设置为包含库的目录。
  • 致电System.loadLibrary("X"),其中“X”是上述图书馆名称的跨平台部分

您将图书馆命名为HelloNative.so;将其更改为libHelloNative.so.

来自http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp679

  

System.loadLibrary的参数是   任意选择的图书馆名称   程序员。系统遵循a   标准,但特定于平台,   转换库名称的方法   到本机库名称。例如,   Solaris系统转换名称   pkg_Cls到libpkg_Cls.so,而a   Win32系统转换相同的pkg_Cls   名称为pkg_Cls.dll。

如果您将来使用OSGi,可以选择设置java.library.path.