我想在 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/