我有以下类(class):
NativeClass.java
public class NativeClass {
public static final int CONSTANT_VALUE = getValue();
public static native int getValue();
}
测试类.java
public class TestClass {
public static void main(String[] args) {
System.loadLibrary("native");
System.out.println(NativeClass.CONSTANT_VALUE);
}
}
C 代码:
#include <jni.h>
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
(*env)->FindClass(env, "LNativeClass;");
return JNI_VERSION_1_6;
}
JNIEXPORT jint JNICALL Java_NativeClass_getValue(JNIEnv *env, jclass cls) {
return 5;
}
我编译的 C 文件是这样的:
gcc NativeClass.c -I"JNI_HEADER_PATH" -shared -fPIC -o libnative.so
然后像这样执行代码:
java -Djava.library.path=. TestClass
然后我得到以下异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: NativeClass.getValue()I
如果我将 System.loadLibrary("native");
移动到 NativeClass
中的静态初始化程序 block ,它就可以正常工作:
public class NativeClass {
static {
System.loadLibrary("native");
}
public static final int CONSTANT_VALUE = getValue();
public static native int getValue();
}
我在这里错过了什么?
此处的代码只是我在项目中遇到的确切错误的示例。
我绝对需要在 NativeClass
中声明常量,我还需要在 JNI_OnLoad 中找到该类,因为我必须在其中调用静态方法。
最佳答案
main
是 TestClass
的一部分,在加载 TestClass
之前无法调用。但是 TestClass
在调用 System.loadLibrary("native");
之前无法加载。
所以这个
public static void main(String[] args) {
System.loadLibrary("native");
永远不会被调用 - 调用 main
取决于正在加载的类,这取决于正在调用的 loadLibrary
而这取决于正在调用的 main
。 ...
关于Java/JNI - 在 JNI_OnLoad 中查找类时出现 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427845/