【问题标题】:Show Toast in Android by sending string from c++ JNI in qt通过从 qt 中的 c++ JNI 发送字符串在 Android 中显示 Toast
【发布时间】:2014-03-07 16:52:02
【问题描述】:

我正在尝试在 C++ 端的 Java 方法调用上显示祝酒词 我设法调用了该方法,甚至得到了字符串,但是 Toast 没有工作我已经尝试了几乎所有的上下文和所有

C++ 方面

JavaVMAttachArgs args = { JNI_VERSION_1_6, NULL, NULL };
vm->AttachCurrentThread( &env, &args );
activityConstructor =  env->GetMethodID(activity, "<init>", "()V");
jobject object = env->NewObject(activity, activityConstructor);

toastID = env->GetMethodID(activity, "toast", "(Ljava/lang/String;)V");
qDebug() << "Moving";
jstring message1 = env->NewStringUTF("This comes from jni.");

qDebug()<< "Test" << message1;
env->CallVoidMethod(object, toastID, message1);

Java 端

  public void toast(String message){    

    messageData = message;
Log.d(TAG, message);
new Thread()
{
    public void run()
    {
    esActivity.this.runOnUiThread(new Runnable(){

        public void run(){
            Log.d("Message in UIThread", messageData);
            Toast.makeText(context, messageData, Toast.LENGTH_SHORT).show();
        }
        });
    }
}.start();

}

我在消息中输入字符串值,但这个 Toast 没有显示任何内容

任何想法将不胜感激..谢谢

【问题讨论】:

  • 你是从主 UI 线程调用 toast 方法吗?
  • 不,但我有来自活动的上下文...
  • 没关系,你不能从主线程以外的任何线程修改 UI,这就是为什么不显示,只需从 runOnUIThread 或 Handler 调用 Toast.make...它会显示...
  • hmm...我在上面的代码中更改了我的 toast 方法...但它仍然无法正常工作..你能看到其中的任何问题..
  • 您收到日志消息了吗?

标签: android c++ qt java-native-interface


【解决方案1】:

在深入分析了我的代码之后,我发现了我的代码中的问题。希望这个答案对将来的某人有所帮助。

这是 C++ 中 JNI 调用中的问题,用于 java 方法。我不得不调用DetachCurrentThread(),因为在 JNI 中,本机线程仍然连接到 VM,并且它保留在本机方法中。改进后的正确代码是

JavaVMAttachArgs args = { JNI_VERSION_1_6, NULL, NULL };
vm->AttachCurrentThread( &env, &args );
activityConstructor =  env->GetMethodID(activity, "<init>", "()V");
jobject object = env->NewObject(activity, activityConstructor);

toastID = env->GetMethodID(activity, "toast", "(Ljava/lang/String;)V");
qDebug() << "Moving";
jstring message1 = env->NewStringUTF("This comes from jni.");

qDebug()<< "Test" << message1;
env->CallVoidMethod(object, toastID, message1);
vm->DetachCurrentThread();

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2012-07-21
    • 2014-08-24
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    相关资源
    最近更新 更多