繁体   English   中英

Java / JNI-在JNI_OnLoad中查找类时出现UnsatisfiedLinkError

[英]Java/JNI - UnsatisfiedLinkError when finding class in JNI_OnLoad

我有以下课程:

NativeClass.java

public class NativeClass {

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

TestClass.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的静态初始化器块,它可以正常工作:

public class NativeClass {

    static {
        System.loadLibrary("native");
    }

    public static final int CONSTANT_VALUE = getValue();

    public static native int getValue();

}

我在这里想念什么? 这里的代码只是我在项目中遇到的确切错误的示例。 我绝对需要在NativeClass声明该常量,并且还需要在JNI_OnLoad中找到该类,因为我必须在其中调用静态方法。

mainTestClass一部分, TestClass加载TestClass之前无法调用。 但是直到System.loadLibrary("native");才能加载TestClass System.loadLibrary("native"); 叫做。

所以这

public static void main(String[] args) {
    System.loadLibrary("native");

永远不会被调用-调用main取决于要加载的类,取决于要调用的loadLibrary取决于取决于被调用的main ...。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM