我的问题,直接关系到这个帖子: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