Java JNI:调用GetStaticMethodID失败

Java JNI:调用GetStaticMethodID失败,java,android,c++,java-native-interface,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

我编写一些代码来获得一个派生线程,以调用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();
JNIEnv*env;
jint-ret=ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env,NULL);
LOGI(“附件当前线程返回%d”,返回);
if(ThreadJNIEnvironment::interfaceClass)
{
jmethodide testMethod=env-->GetStaticMethodID(static_CastThreadJnienEnvironment::interfaceClass),“Test”和“()V”);
env->CallStaticVoidMethod(static_cast(ThreadJNIEnvironment::interfaceClass),testMethod);
}
ThreadJNIEnvironment::javaVM->DetachCurrentThread();

你活着,你学习

在查找
接口类后检查异常,或者只检查它是否为非空。很可能类查找失败。

interfaceClass确实为空,谢谢。但是,当从本机Java调用调用时,它可以正常工作。我会找出我现在做错了什么!事实证明,在调用JNI_OnLoad时,我需要创建一个接口类的全局引用,然后使用它,而不是从新线程的JNIEnv实例中查找它。您还可以缓存方法ID(不需要引用),并且应该为该类使用弱全局引用。您需要引用,因为您对类引用的访问超出了单个JNI调用的范围(您得到的初始引用是本地引用)。