Linux上的JNI问题:无法打开共享对象文件

我已经在这里看到了这个问题,尝试了所提出的修复,但迄今为止还没有成功。 我有一些Java的经验,但JNI很久以前,从来没有在Linux上做过,但…

我试图得到一个简单的HelloWorld JNI应用程序在Linux上运行。

小java文件:

class HelloWorld { private native void print(); public static void main(String[] args){ new HelloWorld().print(); } static { System.out.println(System.getProperty("java.library.path")); System.loadLibrary("HelloWorld"); } } 

小C文件:

 #include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; } 

通过以下方式编译C文件:

 gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so 

运行应用程序:

 java HelloWorld 

要么

 java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld 

但没有好处,得到一个:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory 

奇怪,因为实际上有一个/home/nxp40954/jnitesting/libHelloWorld.so文件。

有人有线索吗?

这样执行:

 export LD_LIBRARY_PATH=. java HelloWorld 

无法加载.so文件时抛出java.lang.UnsatisfiedLinkError。 LD_LIBRARY_PATH变量指向额外的位置以查找* .so文件。

我在与Sun Java的32位Ubuntu的。 我正在编译这种方式:

 gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so 

您的示例在32位Linux安装上为我工作。

您的共享库是作为32位还是64位共享库编译的? 检查命令file libHelloWorld.so 。 如果您的共享库是64位的,那么在启动Java时需要提供命令行选项-d64 ,以便Java可以加载64位共享库。

如果你的共享库是32位的,那么Java选项-d32可能会解决这个问题。