(1) 在Jni.cpp中使用了全局变量
JNIEnv *g_env; jobject g_object;
JNIEXPORT jstring JNICALL Java_com_example_cocos2dinput_MainActivity_getStringFromC(JNIEnv* env,jobject thiz) { g_env=env; g_object=thiz; return env->NewStringUTF("callCMessageBox"); }
09-15 13:25:14.569: E/dalvikvm(15269): JNI ERROR (app bug): attempt to use stale local reference 0x1e800001
原因是因为在JAVA JNI中,对象要全局变量就要给他保持全局引用(不知道是不是这样说。。)。
使用
g_object=(jobject)(env->NewGlobalRef(thiz));
JNIEXPORT jstring JNICALL Java_com_example_cocos2dinput_MainActivity_getStringFromC(JNIEnv* env,jobject thiz) { g_env=env; g_object=(jobject)(env->NewGlobalRef(thiz)); return env->NewStringUTF("callCMessageBox"); }
(2) 修改了上面的问题后又出现以下问题:
我在C++中调用Android弹出一个提示框,原来直接在Jni.cpp中不使用全局变量是一切OK的,但是使用了AndroidPlatform.cpp之后就使用了全局变量g_object、g_env,所以出现上面的问题,修复了上面问题1后,Android层又出问题了!!
public static Context mContext; mContext=this.getApplicationContext(); public void showMessage() { Log.d("showMessage", "showMessage"); AlertDialog.Builder builder=new Builder(mContext); builder.setTitle("C++调用Android"); builder.setMessage("这是一个C++调用Android的例子"); builder.show(); }
android.view.WindowManager$BadTokenException: Unable to add window — token null
代码修改成下面后OK:
public static Context mContext; mContext=MainActivity.this; public void showMessage() { Log.d("showMessage", "showMessage"); AlertDialog.Builder builder=new Builder(mContext); builder.setTitle("C++调用Android"); builder.setMessage("这是一个C++调用Android的例子"); builder.show(); }