不满意 Link 加载 JNI 库时出错
Unsatisfied Link Error When Loading JNI Library
我正在编写一个简单的 Hello World Java 程序来调用本机库中的代码。但是,当我 运行 程序时,我收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TestJNI in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1764)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1044)
at TestJNI.<clinit>(TestJNI.java:4)
代码如下:
Java:
//filename: TestJNI.java
public class TestJNI{
static{
System.loadLibrary("TestJNI");
}
private native void helloWorld();
public static void main(String[] args){
new TestJNI().helloWorld();
}
}
C:
//filname:TestJNI.c
#include <jni.h>
#include <stdio.h>
#include "TestJNI.h"
JNIEXPORT void JNICALL Java_TestJNI_helloWorld(JNIEnv *env, jobject thisObj){
printf("Hello World!\n");
return;
}
C 文件使用以下编译器、标志和参数编译:
clang -o TestJNI.jnilib -I/System/Library/Frameworks/JavaVM.framework/Headers -lc -shared TestJNI.c
那么 Java 申请就是 运行 如下:
java -Djava.library.path=. TestJNI
我正在 运行 编译 Mac OS X Yosemite 上的文件。有谁知道我做错了什么吗?
您的库应该命名为 .so 以便它可以作为共享库加载。我相信您的编译行应该类似于:
clang -shared -undefined dynamic_lookup -o TestJNI.so -I/System/Library/Frameworks/JavaVM.framework/Headers -lc TestJNI.c
验证 java.library.path
变量指向包含 TestJNI 库的目录。
你可以试试
System.setProperty("java.library.path", "...directory path...");
或者,使用 System.load("...full path to TestJNI...");
获取库的完整路径(包括文件扩展名)。 (System.loadLibrary
推断出我相信的文件扩展名)
我正在编写一个简单的 Hello World Java 程序来调用本机库中的代码。但是,当我 运行 程序时,我收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TestJNI in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1764)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1044)
at TestJNI.<clinit>(TestJNI.java:4)
代码如下:
Java:
//filename: TestJNI.java
public class TestJNI{
static{
System.loadLibrary("TestJNI");
}
private native void helloWorld();
public static void main(String[] args){
new TestJNI().helloWorld();
}
}
C:
//filname:TestJNI.c
#include <jni.h>
#include <stdio.h>
#include "TestJNI.h"
JNIEXPORT void JNICALL Java_TestJNI_helloWorld(JNIEnv *env, jobject thisObj){
printf("Hello World!\n");
return;
}
C 文件使用以下编译器、标志和参数编译:
clang -o TestJNI.jnilib -I/System/Library/Frameworks/JavaVM.framework/Headers -lc -shared TestJNI.c
那么 Java 申请就是 运行 如下:
java -Djava.library.path=. TestJNI
我正在 运行 编译 Mac OS X Yosemite 上的文件。有谁知道我做错了什么吗?
您的库应该命名为 .so 以便它可以作为共享库加载。我相信您的编译行应该类似于:
clang -shared -undefined dynamic_lookup -o TestJNI.so -I/System/Library/Frameworks/JavaVM.framework/Headers -lc TestJNI.c
验证 java.library.path
变量指向包含 TestJNI 库的目录。
你可以试试
System.setProperty("java.library.path", "...directory path...");
或者,使用 System.load("...full path to TestJNI...");
获取库的完整路径(包括文件扩展名)。 (System.loadLibrary
推断出我相信的文件扩展名)