gpt4 book ai didi

java - JNI : Calling GetStaticMethodID blows up

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:22 25 4
gpt4 key购买 nike

我正在编写一些代码来获得生成的线程以从 C++ 调用静态 Java 方法。

如果放置在来自 Java 的 native 调用中,调用该方法的位可以正常工作,但不能来自带有附加 JNIEnv 的线程。

我设置了一个 JavaVM* 如下:

jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
LOGI("Setting Java Virtual Machine");

ThreadJNIEnvironment::javaVM = jvm;

return JNI_VERSION_1_6;
}

这会被调用。

然后我生成另一个线程,并从这个线程执行以下操作:

JNIEnv* env;
jint ret = ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env, NULL);

LOGI("AttachCurrentThread returned %d", ret);

jclass interfaceClass = env->FindClass("com/ecmsys/mcb/model/McbInterface");
jmethodID testMethod = env->GetStaticMethodID(interfaceClass, "Test", "()V");
env->CallStaticVoidMethod(interfaceClass, testMethod);

AttachCurrentThread 返回 0。

GetStaticMethod 因以下错误而崩溃:

Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1).....

我只是看不出我做了什么来打乱它...哦等等...如果不进行一些设置,您将无法从生成的线程访问 Java 应用程序类...

jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
LOGI("Setting Java Virtual Machine");
ThreadJNIEnvironment::javaVM = jvm;

JNIEnv* env;


jvm->AttachCurrentThread(&env, NULL);
jclass mcbInterface = env->FindClass("com/ecmsys/mcb/model/McbInterface");
ThreadJNIEnvironment::interfaceClass = env->NewGlobalRef(mcbInterface);

return JNI_VERSION_1_6;
}

然后这样做:

JNIEnv* env;
jint ret = ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env, NULL);

LOGI("AttachCurrentThread retured %d", ret);

if(ThreadJNIEnvironment::interfaceClass)
{
jmethodID testMethod = env-->GetStaticMethodID(static_cast<jclass>ThreadJNIEnvironment::interfaceClass), "Test", "()V");
env->CallStaticVoidMethod(static_cast<jclass>(ThreadJNIEnvironment::interfaceClass), testMethod);
}


ThreadJNIEnvironment::javaVM->DetachCurrentThread();

你生活和学习!

最佳答案

在查找 interfaceClass ( env->ExceptionCheck() ) 后检查异常,或者简单地检查它是否为非 NULL。类查找很可能失败。

关于java - JNI : Calling GetStaticMethodID blows up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14523529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com