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变量指向额外的位置来查找*。所以文件。

我用的是32位ubuntu和sun java。我是这样编译的:

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将解决问题。

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

最新更新