无法使用来自其他对象的CallVoidMethod

时间:2014-07-16 10:09:19

标签: java-native-interface

有两个A,B级 m_Class,m_MethodID不为NULL。
但是在调用env-> CallVoidMethod后,系统会崩溃,为什么?

public Class A extends Activity {
    protected void onActivityResult(int reqCode, int resultCode, Intent data) {
        super.onActivityResult(reqCode, resultCode, data);

        B BClass = new B();
        BClass.setFunction(this, "testFunc");
    }
    public void testFunc() {
        Log.e("", "Test");
    }
}

public Class B {

    public native void setFunction(Object caller, String method);
}

------------- ------------- JNI

JNIEXPORT void JNICALL Java_com_B_setFunction(JNIEnv *env, jobject thiz, jobject clsCaller, jstring sMethod) {

    string sMethodName = jstring2str(env, sMethod);
    jclass m_Class = env->GetObjectClass(clsCaller);
    jmethodID m_MethodID = env->GetMethodID(m_Class, sMethodName.c_str(), "()V");

    env->CallVoidMethod(m_Class, m_MethodID);
}

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题.. 我参考了这个页面Android NDK: calling java method from JNI C class 并修改JNI中的代码

env->CallVoidMethod(m_Class, m_MethodID);

env->CallVoidMethod(clsCaller, m_MethodID);

因为CallVoidMethod是按实例触发的(clsCaller)而不是类(m_Class)