Linux, java.lang.UnsatisfiedLinkError: no "library file" in java.library.path
Linux, java.lang.UnsatisfiedLinkError: no "library file" in java.library.path
我正在尝试 运行 一个简单的 JNI 示例,其中我 运行 一个通过动态库调用 c++ 函数的 java 应用程序。
我将post我使用的以下代码和终端命令。
.java
public class Lab{
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String args[]) {
new Lab().hello();
}
}
通过终端获取.class和头文件
javac Lab.java
javah -jni Lab
hello.cpp 文件
#include "Lab.h"
#include <stdio.h>
#include <iostream>
JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) {
cout<<"Hello World"<<endl;
}
生成lib文件"hello.so":
gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cpp
最后 运行 文件:
java -Djava.library.path=. Lab
然后我得到错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Lab.<clinit>(Lab.java:6)
我知道还有其他 post 存在同样的问题,但不幸的是,这些解决方案中的 none 对我有用。
我已经尝试过诸如:
- 将 hello.so 文件复制到 java lib 路径中的“/usr/lib”,并使用 chmod 赋予它权限;
- 同时使用导出将 hello.so 文件路径添加到 $LD_LIBRARY_PATH;
- 添加 hello.so 路径时 运行 宁 java 文件 (java -Djava.library.path="/root/Desktop" 实验室);
- 使用甚至不起作用的 ldconfig。
我需要在一个主要的应用程序上使用它,但我只是在尝试一个简单的例子,即使使用我在其他 posts 上阅读的所有解决方案,我也无法让它工作。
谢谢。
搜索 Stack 并找到我需要的东西的另一天。
在 Linux 上,.so lib 文件必须具有前缀 "lib"。所以在我的示例中,我的 lib 文件应该命名为 libhello.so 而不是 hello.so 并且一切正常。
我正在尝试 运行 一个简单的 JNI 示例,其中我 运行 一个通过动态库调用 c++ 函数的 java 应用程序。
我将post我使用的以下代码和终端命令。
.java
public class Lab{
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String args[]) {
new Lab().hello();
}
}
通过终端获取.class和头文件
javac Lab.java
javah -jni Lab
hello.cpp 文件
#include "Lab.h"
#include <stdio.h>
#include <iostream>
JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) {
cout<<"Hello World"<<endl;
}
生成lib文件"hello.so":
gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cpp
最后 运行 文件:
java -Djava.library.path=. Lab
然后我得到错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Lab.<clinit>(Lab.java:6)
我知道还有其他 post 存在同样的问题,但不幸的是,这些解决方案中的 none 对我有用。 我已经尝试过诸如:
- 将 hello.so 文件复制到 java lib 路径中的“/usr/lib”,并使用 chmod 赋予它权限;
- 同时使用导出将 hello.so 文件路径添加到 $LD_LIBRARY_PATH;
- 添加 hello.so 路径时 运行 宁 java 文件 (java -Djava.library.path="/root/Desktop" 实验室);
- 使用甚至不起作用的 ldconfig。
我需要在一个主要的应用程序上使用它,但我只是在尝试一个简单的例子,即使使用我在其他 posts 上阅读的所有解决方案,我也无法让它工作。
谢谢。
搜索 Stack 并找到我需要的东西的另一天