Error when using JNI on ubuntu: java.lang.UnsatisfiedLinkError: no ... in java.library.path
Error when using JNI on ubuntu: java.lang.UnsatisfiedLinkError: no ... in java.library.path
我知道有关于此主题的类似问题,但 none 个答案可以解决我的问题:
我有一个 java 文件:
class hjni {
static {
System.loadLibrary("hjni");
}
private native void print();
public static void main(String[] args) {
new hjni().print();
}
}
我使用下面的方式编译生成头文件:
javac hjni.java
javah -jni hjni
这是 C++ 文件:
#include <jni.h>
#include <stdio.h>
#include "hjni.h"
JNIEXPORT void JNICALL
Java_hjni_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
我编译C++文件:
g++ -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux hjni.cpp -o hjni.so
文件 hjni.class
、hjni.h
和 hjni.so
已全部创建。
我运行 java 文件:
java -Djava.library.path=. hjni
这是我得到的错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hjni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1889)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at hjni.<clinit>(hjni.java:4)
我用java -XshowSettings:properties
检查java.library.path
:
java.library.path = /usr/java/packages/lib/amd64
/usr/lib/x86_64-linux-gnu/jni
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/jni
/lib
/usr/lib
有趣的是,文件夹
/usr/java/packages/lib/amd64
不存在:
cd /usr/java/packages/lib/amd64
bash: cd: /usr/java/packages/lib/amd64: No such file or directory
我可以在这里找到共享库 (libjli.so):
/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli
当我通过
添加上面的路径时
export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli
只要打开终端,路径就添加成功了。如果我关闭终端并重新打开它,那么添加的路径将不再存在。我也将 hjni.so
复制到 jli
文件夹,但我遇到了同样的链接错误。
当您执行 System.loadLibrary("hjni")
时,Java 将查找名为 libhjni.so
的文件。调用 System.mapLibraryName(libname)
找出给定库的文件名应该是什么。不幸的是,mapLibraryName
的 Javadoc 只说明名称将映射到平台相关名称,但没有说明构建此文件名的规则是什么。 Windows 是 <name>.dll
,Linux 是 lib<name>.so
,Mac OS X 是 lib<name>.jnilib
,但我找不到现在的参考。
如果重命名文件,一切都会正常。
我知道有关于此主题的类似问题,但 none 个答案可以解决我的问题:
我有一个 java 文件:
class hjni {
static {
System.loadLibrary("hjni");
}
private native void print();
public static void main(String[] args) {
new hjni().print();
}
}
我使用下面的方式编译生成头文件:
javac hjni.java
javah -jni hjni
这是 C++ 文件:
#include <jni.h>
#include <stdio.h>
#include "hjni.h"
JNIEXPORT void JNICALL
Java_hjni_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
我编译C++文件:
g++ -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux hjni.cpp -o hjni.so
文件 hjni.class
、hjni.h
和 hjni.so
已全部创建。
我运行 java 文件:
java -Djava.library.path=. hjni
这是我得到的错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hjni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1889)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at hjni.<clinit>(hjni.java:4)
我用java -XshowSettings:properties
检查java.library.path
:
java.library.path = /usr/java/packages/lib/amd64
/usr/lib/x86_64-linux-gnu/jni
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/jni
/lib
/usr/lib
有趣的是,文件夹
/usr/java/packages/lib/amd64
不存在:
cd /usr/java/packages/lib/amd64
bash: cd: /usr/java/packages/lib/amd64: No such file or directory
我可以在这里找到共享库 (libjli.so):
/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli
当我通过
添加上面的路径时export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli
只要打开终端,路径就添加成功了。如果我关闭终端并重新打开它,那么添加的路径将不再存在。我也将 hjni.so
复制到 jli
文件夹,但我遇到了同样的链接错误。
当您执行 System.loadLibrary("hjni")
时,Java 将查找名为 libhjni.so
的文件。调用 System.mapLibraryName(libname)
找出给定库的文件名应该是什么。不幸的是,mapLibraryName
的 Javadoc 只说明名称将映射到平台相关名称,但没有说明构建此文件名的规则是什么。 Windows 是 <name>.dll
,Linux 是 lib<name>.so
,Mac OS X 是 lib<name>.jnilib
,但我找不到现在的参考。
如果重命名文件,一切都会正常。