通过从 qt 中的 c++ JNI 发送字符串在 Android 中显示 Toast

Posted

技术标签:

【中文标题】通过从 qt 中的 c++ JNI 发送字符串在 Android 中显示 Toast【英文标题】:Show Toast in Android by sending string from c++ JNI in qt 【发布时间】: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 方法...但它仍然无法正常工作..你能看到其中的任何问题.. 您收到日志消息了吗? 【参考方案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();

【讨论】:

以上是关于通过从 qt 中的 c++ JNI 发送字符串在 Android 中显示 Toast的主要内容,如果未能解决你的问题,请参考以下文章

JNI 通过多线程从 C++ 调用 Java

通过从我的数据库表中发送用户名和密码来登录 Facebook

如何通过从vuejs组件获取数据在Laravel控制器中创建多个行

通过从多个列中删除匹配的电子邮件域来过滤 Pandas 数据框

JNI:如何将一组数据从 c++ 转换为 Java

使用 Qt/C++ 通过 JNI 调用 Java 代码。 FindClass 找不到类