我的問題,直接關係到這個帖子:https://groups.google.com/forum/#!topic/android-ndk/291sBdkITyI使用由C++ NDK的Android更新UI
基本上,我有寫在C編譯NDK的一個基本的Android(活動)的應用程序++。我有一個文本視圖(Java中),需要在C++端發生某些事情時進行更新(比如狀態變化)。我想從C++調用Java並在狀態更改時更新textview。
在上面的鏈接,他們所使用的代碼是(可能的僞代碼):
public class Example extends Activity{
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
this.currentDownloadField.setText(""+ msg.what);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
// whatever
}
public static void sendMessage(int id){
handler.sendEmptyMessage(id); // just the what() is filled with the id
}
}
而且從C++調用將是
void sendMessage(char* buffer, int bufferlen) {
JNIEnv *env = NULL;
jmethodID mid = NULL;
jbyteArray message;
jint res = (jjvm->AttachCurrentThread(&jjvm, &env, NULL));
if (res >= 0) {
message = (*env)->NewByteArray(env, bufferlen);
(*env)->SetByteArrayRegion(env, message, 0, bufferlen, (const jbyte *) ((BYTE*) buffer));
mid = (*env)->GetStaticMethodID(env, jcls, "sendMessage", "([B)V");
// Mid <= 0 ? Not found : OK
if (mid > 0) {
(*env)->CallStaticVoidMethod(env, jcls, mid, message);
}
}
}
問題在酶活性使用「處理程序」從靜態函數不起作用(因爲它不是靜態的)。如果它是靜態的,那麼如何引用「this.currentDownloadField」?
我也試過打電話是從C++
public void update(String message) {
Log.i("logging", "Hit here")
mMyTextField.setText(message);
}
當C++調用Java函數「更新」,日誌命中(在logcat中),但是TextView的不更新公共功能。也許這是線程的問題,但我不知道如何正確更新文本字段。
另一種選擇是輪詢和具有Java調用C++讀取變量(狀態),但是這是乏味的,而不是良好的編程習慣。
任何建議來解決這個問題?
在此先感謝。
這就是當我從該頁面複製並粘貼時發生的情況:P – user654628
對於對處理程序被泄露警告感到好奇的人,請執行以下操作:http://stackoverflow.com/questions/11278875/handlers-and-內存泄漏功能於安卓 – user654628