首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux上的JNI问题:无法打开共享目标文件

Linux上的JNI问题:无法打开共享目标文件
EN

Stack Overflow用户
提问于 2011-09-02 21:28:45
回答 3查看 14.1K关注 0票数 13

我已经在这里看到了这个问题,尝试了建议的修复,但到目前为止对我来说还没有成功。我有相当多的Java经验,但JNI是很久以前的事了,虽然从来没有在Linux上做过……

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

小java文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so

通过以下方式运行该应用程序:

代码语言:javascript
复制
java HelloWorld

代码语言:javascript
复制
java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld

但这并不好,得到一个:

代码语言:javascript
复制
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文件。

有谁有线索吗?

EN

回答 3

Stack Overflow用户

发布于 2011-09-02 22:26:34

按如下方式执行:

代码语言:javascript
复制
export LD_LIBRARY_PATH=.
java HelloWorld

当无法加载.so文件时,将引发java.lang.UnsatisfiedLinkError。LD_LIBRARY_PATH变量指向查找*.so文件的额外位置。

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

代码语言:javascript
复制
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
票数 13
EN

Stack Overflow用户

发布于 2011-09-02 23:00:31

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

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

如果您的共享库是32位的,那么也许Java选项-d32就可以解决这个问题。

票数 5
EN

Stack Overflow用户

发布于 2020-04-21 23:43:01

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

java.library.path是一个JVM变量,可以通过命令行参数进行设置

代码语言:javascript
复制
-Djava.library.path=xy

由java调用loadLibrary()加载的DLL(在windows上)和so(在linux上)必须位于java.library.path中。

在Windows中,系统路径是根据PATH环境变量解析的,在linux中是LD_LIBRARY_PATH环境变量(用于链接库)。

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

代码语言:javascript
复制
sudo chmod 755 myLinkedLib

真的很管用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7284129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档