【发布时间】:2014-01-27 14:41:31
【问题描述】:
我的问题与这篇文章直接相关:https://groups.google.com/forum/#!topic/android-ndk/291sBdkITyI
基本上,我有一个用 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 中)但文本视图没有更新。也许这是线程的问题,但我不知道如何正确更新文本字段。
另一种选择是轮询并让 Java 调用 C++ 来读取变量(状态),但这很乏味且不是良好的编程习惯。
有解决这个问题的建议吗?
提前致谢。
【问题讨论】:
标签: java android c++ user-interface android-ndk