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

时间:2011-09-02 13:28:45

标签: linux java-native-interface

我在这里看过这个问题,尝试过提议的修复,但到目前为止我没有成功。我有很多Java经验,但JNI很久以前,从来没有在Linux上做过......

我正在尝试在Linux上运行一个简单的HelloWorld JNI应用程序。

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

有没有人有线索?

3 个答案:

答案 0 :(得分:8)

以这种方式执行:

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

答案 1 :(得分:4)

您的示例适用于32位Linux安装。

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

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

答案 2 :(得分:0)

java.library.path和系统路径的说明:

java.library.path是可以设置的JVM变量-例如-通过命令行参数

-Djava.library.path=xy
由Java调用loadLibrary()加载的

DLL(在Windows上)和so(在linux上)必须位于java.library.path中。如果通过JNI加载,则必须位于系统路径中。

如果这样的链接库加载了另一个链接库,则必须在系统路径中找到后者。在Windows中,系统路径是根据PATH环境变量解析的,而在Linux中,它是LD_LIBRARY_PATH环境变量(对于链接的库)。

在Linux中要确保的另一点:验证链接库对当前用户具有可执行权限。通常是

sudo chmod 755 myLinkedLib

起到了作用。