我有一个名为HelloWorld.so的库和一个包含以下内容的程序HelloWorld.java:
class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
现在,当我尝试运行HelloWorld.java时,我收到此错误:
$ /usr/java1.4/bin/java HelloWorld Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) at HelloWorld.<clinit>(HelloWorld.java:7)
任何提示?
答案 0 :(得分:12)
我认为在收到此错误时,有些要点很有用:
System.loadLibrary("HelloWorld");
libHelloWorld.so
libHelloWorld.so
HelloWorld.dll
libHelloWorld.jnilib
-Djava.library.path=PATH
。 PATH
放置您的jni库的位置以下是我的参考:https://blogs.oracle.com/moonocean/entry/a_simple_example_of_jni
答案 1 :(得分:10)
我遇到了这个问题并通过将我的库重命名为libHelloWorld.so
并遵循迈克尔迈尔斯的建议来修复它。我在Arch Linux 64位上。
HelloWorld.c
:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
/* shamelessly stolen from the book 'The Java Native Interface: Programmer's
Guide and Specification' */
JNIEXPORT void JNICALL
Java_HelloWorld_print (JNIEnv *env, jobject obj) {
printf("Hello World!\n");
}
HelloWorld.java
:
class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
构建和测试:
$ javac HelloWorld.java
$ javah -classpath . HelloWorld
$ gcc -shared -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux HelloWorld.c -o libHelloWorld.so
$ java -classpath . -Djava.library.path=. HelloWorld
Hello World!
tl; dr:将lib
放在图书馆文件名的开头
答案 2 :(得分:7)
HelloWorld.so在哪里?您可能需要使用命令行参数"-Djava.library.path"
指定其父目录。
例如,如果它在"/path/libs/HelloWorld.so"
中,则在调用-Djava.library.path=/path/libs
时添加java
作为选项。例如,我的一个项目是"-Djava.library.path=lib"
。
编辑:Dan Dyer指出环境变量LD_LIBRARY_PATH
也可用于此。
答案 3 :(得分:1)
@mmyers感谢您的回复。我们发现我们所要做的就是将System.loadLibrary更改为System.load并将完整路径+文件名作为参数传递,就像魅力一样。
即使在这样做之前,我们尝试使用“-D”参数并设置LD_LIBRARY_PATH但我们没有成功。
去图吧! :)
再次感谢, 卡伦