(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();
}原文:http://blog.csdn.net/huutu/article/details/11706105