我正在尝试构建并运行一个示例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
以及HelloClassTest
和HelloNative.so
,他们都在那里。我也尝试指定-CLASSPATH
,但这似乎并不重要。
有没有人有任何想法?
答案 0 :(得分:0)
您也可以尝试设置java.library.path
:
java -Djava.library.path=/myDir/myExample HelloNativeTest
答案 1 :(得分:0)
你是从Java做过System.loadLibrary()吗?
答案 2 :(得分:0)
执行以下操作,其中X =“HelloNative”。
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.