JNI:调用GetStaticMethodID会爆炸

时间:2013-01-25 14:12:37

标签: java android c++ java-native-interface

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

如果将该方法置于Java的本机调用中,而不是来自具有附加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();

你生活和学习!

1 个答案:

答案 0 :(得分:4)

查找interfaceClassenv->ExceptionCheck())后检查异常,或者只是检查它是否为非NULL。最有可能的是类查找失败。