2011-09-02 61 views
7

我在这里看到了这个问题,尝试了所提出的修复方法,但迄今为止还没有成功。我有相当一些Java的经验,但JNI很久以前,从来没有在Linux上做过...Linux上的JNI问题:无法打开共享对象文件

我试图得到一个简单的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文件:

java HelloWorld 

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

通过运行程序

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文件。

有没有人有线索?

回答

7

执行这种方式:

export LD_LIBRARY_PATH=. 
java HelloWorld 

的java.lang.UnsatisfiedLinkError中当.so文件无法加载异常。 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 
+0

是的,我知道libs应该走LD_LIBRARY_PATH定义的路径,“。”也在那里,甚至通过使用-Djava.library.path =/home/nxp40954/jnitesting我明确地定义了libHelloWorld.so的位置,但我仍然得到这个“没有这样的文件或目录”的错误。 – Vlemmix

+0

我编译了你的代码,它适用于我。你可以尝试在一个目录中完成所有操作,并使用“。”。 ?顺便说一句,你用什么java? Waht OS? –

4

你的例子在32位Linux安装上为我工作。

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

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

+0

谢谢你!应该有这个想法。没有64位JVM支持,但lib是64位的。添加了-m32参数给gcc,一切都没有。谢谢! – Vlemmix

+1

如果你不喜欢我,那么请确保你指定'LD_LIBRARY_PATH'环境变量,而不是Java的java.library.path'。这是因为如果你的链接库需要访问另一个链接库,它将无法找到它,因为它不知道java.library.path。 –

相关问题