java - 我应该如何为 JNI 加载 native 库以避免 UnsatisfiedLinkError?

标签 java c java-native-interface

我想在 Ubuntu 8.10 上使用 JNI,使用 Eclipse 和 gcc(Ubuntu 的标准版本,如果有的话)。

尽管 make 文件成功创建了我的库,但我似乎无法加载它。

主要的Java类如下:

class Hello {
    public native void sayHello();

    static {
        System.loadLibrary("hello.so");
    }

    public static void main(String[] args) {
        Hello h = new Hello();
        h.sayHello();
    }
}

我的 make 文件是这样的;

    all : hello.so

hello.so : Hello.o
    gcc -shared -o hello.so Hello.o

Hello.o : Hello.c Hello.h
    gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -c Hello.c -o Hello.o

Hello.h : Hello.class
    javah -jni Hello

clean :
    -del Hello.h
    -del Hello.o

其余的代码 (Hello.c) 看起来就像人们想象的那样。

我得到的错误如下;

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello.so in java.library.path

如果我使用显式路径:

System.loadLibrary("/home/gavin/Work/workspace/JNI/hello.so");

然后它就可以工作了,但我宁愿尽可能不使用显式路径。

最佳答案

根据 Pax,您应该将库路径设置为 Java 应该查找库的位置。您的库名称应该是 libhello.so。加载库的调用应该是:

System.loadLibrary("hello");

Linux 库由约定 libname.so 引用,并根据名称加载。这是一个link关于 SWIG 文档中 Java 中的动态链接问题,尽管您没有使用 SWIG,但本节仍然相关。

关于java - 我应该如何为 JNI 加载 native 库以避免 UnsatisfiedLinkError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903530/

相关文章:

java - 计算java数组中出现的次数

java - 如何将查询设置为未提交读取?

java - 如何选择所有具有相同名称的输入插入到Mysql中?

java - Android Studio 中带有实验性 Gradle 插件的 native 预构建共享库

java - 使用 log4j 的 Sentry 日志记录不起作用

c++ - 如何在我自己的staticLib中使用staticLib?

objective-c - 创建文件路径 :contents:attributes storing a NSString

c - c 中具有常量参数的结构体数组

c - JNI 函数在 android 上返回非法的 UTF 字符

android - 包含带有 gradle 和 Android Studio 1.2.2 的 *.so 文件