Мой вопрос связан непосредственно на этот пост: https://groups.google.com/forum/#!topic/android-ndk/291sBdkITyIИспользование NDK от C++ обновление Android UI
В принципе, у меня есть приложение, написанное на C++, скомпилированного НДК с основным Android (деятельность). У меня есть textview (на Java), который нужно обновлять, когда что-то происходит на стороне C++ (скажем, например, изменение состояния). Я хотел бы вызвать Java из C++ и обновить текстовое представление при изменении состояния.
В приведенной выше ссылке, код, который они использовали (вероятно, псевдо-код):
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