編輯:關於Android編程
(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(); }
以前在使用ListView當中,如果我們的列表數據發生了改變,我們會去調用Adapter.notifyDataSetChanged()去更新UI界面上的列表數據,當然這個
我們一般直接從攝像頭和麥克風取數據,經過編碼,保存為文件。android的視頻錄制需要使用到MediaRecorder,MediaRecorder除了可以用於錄制音頻,還
今天練手一下,一起來畫個太極圖吧~最終效果如下:最終效果一般都是先講原理,我就反其道而行,先講實現吧。1.繼承實現初始化方法繼承View,實現基本的構造函數:public
ContentProvider的一個重要的特點就是它是可以使得某些數據可以被跨進程訪問,一般我們的數據庫是不可跨進程被訪問,因為數據庫一般的數據是屬於某個應用程序的,如果