📜  从 JNI_OnLoad 中返回的错误 JNI 版本 - Java (1)

📅  最后修改于: 2023-12-03 14:49:17.903000             🧑  作者: Mango

从 JNI_OnLoad 中返回的错误 JNI 版本 - Java

JNI (Java Native Interface) 是 Java 中提供的一种通过本地接口与其他编程语言进行交互的方式。当我们在使用 JNI 时,有时会出现从 JNI_OnLoad 中返回的错误 JNI 版本的情况。本文将对该错误的原因及解决方法进行介绍。

问题描述

当我们在使用 JNI 时,在执行 JNI_OnLoad 函数时,有时会发现出现以下错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsatisfiedLinkError: /path/to/libnative.so: /path/to/libnative.so: undefined symbol: JNI_VERSION_1_6
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1811)
	at java.lang.Runtime.load0(Runtime.java:809)
	at java.lang.System.load(System.java:1086)

这是因为 JNI 版本不匹配所导致的问题。

解决方法

我们可以通过以下两种方式来解决该问题:

  1. 确认 JNI 版本

首先需要确定 JNI 版本号,我们可以通过以下方式来确定:

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env;
    jint result = -1;
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return result;
    }
    // your code
    return JNI_VERSION_1_6;
}

在该代码中,我们通过 JNI_VERSION_1_6 来指定 JNI 版本,你需要确认你使用的 JNI 版本与这里指定的版本是否一致。

  1. 确认符号库

如果确认 JNI 版本无误,我们还需要确认所用的符号库是否正确。

在上面的错误信息中,我们可以看到 undefined symbol: JNI_VERSION_1_6,这个 symbol 是对应 JNI 版本的,如果找不到该 symbol,则说明符号库中不包含对应的 JNI 版本。

我们需要查看该符号库是否包含 JNI1.6 的版本,如果没有,则需要重新编译符号库,确保它包含 JNI1.6 的版本。

总结

从 JNI_OnLoad 中返回的错误 JNI 版本是 JNI 中常见的问题之一,解决方法无非就是确认 JNI 版本和符号库两个方面,通过这篇文章,你应该已经了解了该问题的解决方法。