欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

C++调用Android函数弹出一个提示框中出现的问题总结

来源: 开发者 投稿于  被查看 11102 次 评论:238

C++调用Android函数弹出一个提示框中出现的问题总结


(1) 在Jni.cpp中使用了全局变量

 

JNIEnv *g_env;
jobject g_object;

然后在第一个传入了JNIEnv和jobject的函数中初始化了:

 

 

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));

代码修改为以下OK:

 

 

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 

导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。

 

代码修改成下面后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();
		
	}


 

用户评论