日期:2014-05-20  浏览次数:20690 次

Native中在未传入jobject的方法中调用java方法
我现在需要在一个C函数中调用一个非静态的Java方法,但这个C函数不是java中定义的natvie方法,所以没有传入JNIEnv 和 jobject ,这种情况下我要怎样调用指定对象的方法呢?

比如:

Class Test{
    public void callback();
    public native void func();
}
// 在func()里起了个线程,然后func()退出,现在需要在线程里调用callback()

//我这样测试过:

JavaVM *jvm; //缓存的全局变量
jobject g_obj;  //c文件中的全局变量
JNIEXPORT void JNICALL Java_com_xx_cc_func(JNIEnv *env, jobject obj)
{
    g_obj = obj;
    return;
}

//然后在需要调用callback()的时候使用g_obj这个jobject:
void call()
{
  JNIEnv* env;
  (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_2);

  class cls = (*env)->FindClass(env,"com/xx/cc");

  jmethodID mid =  (*env)->GetStaticMethodID(env, cls, "callback","()V");

  (*env)->CallVoidMethod(env, g_obj, mid);
}



但这样程序会崩溃,请问有什么方法解决么???谢谢大家
------最佳解决方案--------------------
需要使用NewGlobalRef函数创建一个Gloal的引用才行:
g_obj = env->NewGlobalRef(obj);
否则在Java_com_xx_cc_func函数结束以后obj被回收,g_obj引用一个被回收的变量,程序肯定有问题
------其他解决方案--------------------
谢谢dr8737010,用NewGlobalRel()可以实现了~~