JNINativeInterface_ * 为空
JNINativeInterface_ * is null
我正在开发 JNI 应用程序。然而,结构 struct JNIEnv_
内的 JNINativeInterface_ * 为空,因此导致对 JNI(示例:env->NewStringUTF(...)
)函数的任何调用都抛出分段错误。 JNIEnv_
结构如下所示:
struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
.
.
.
老实说,我不知道如何解决这个问题,因为我认为 java 应该在您调用 System.loadLibrary(...)
时填充它。感谢您的帮助。
两种可能性:
1) 您的 C++ 代码作为本机函数从 Java 调用:
例如:
JNIEXPORT void JNICALL Java_MyJNative_doSomething(JNIEnv *env, jobject jo)
{
std::cout << "doSomething() : ";
}
JNIEnv*
指针是Java环境给你的。
2) 您的 C++ 代码通过 JNI 调用 Java 代码:
在这种情况下,您必须按照 JNI 调用逻辑设置 JavaVM*
和 JNIEnv*
指针。参见示例 this article。
如果您已经调用 JNIEnv*
但您在 C++ 端使用多个线程,则需要提及一个特殊情况。然后每个线程都必须附加到 JNIEnv*
使用:
JNIEnv *env; // Pointer to native interface
jint rc = jvm->AttachCurrentThread ((void **)&env, nullptr); // Attach without addutiobal parameters
// where jvm is a valid JavaVM*
我正在开发 JNI 应用程序。然而,结构 struct JNIEnv_
内的 JNINativeInterface_ * 为空,因此导致对 JNI(示例:env->NewStringUTF(...)
)函数的任何调用都抛出分段错误。 JNIEnv_
结构如下所示:
struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
.
.
.
老实说,我不知道如何解决这个问题,因为我认为 java 应该在您调用 System.loadLibrary(...)
时填充它。感谢您的帮助。
两种可能性:
1) 您的 C++ 代码作为本机函数从 Java 调用:
例如:
JNIEXPORT void JNICALL Java_MyJNative_doSomething(JNIEnv *env, jobject jo)
{
std::cout << "doSomething() : ";
}
JNIEnv*
指针是Java环境给你的。
2) 您的 C++ 代码通过 JNI 调用 Java 代码:
在这种情况下,您必须按照 JNI 调用逻辑设置 JavaVM*
和 JNIEnv*
指针。参见示例 this article。
如果您已经调用 JNIEnv*
但您在 C++ 端使用多个线程,则需要提及一个特殊情况。然后每个线程都必须附加到 JNIEnv*
使用:
JNIEnv *env; // Pointer to native interface
jint rc = jvm->AttachCurrentThread ((void **)&env, nullptr); // Attach without addutiobal parameters
// where jvm is a valid JavaVM*