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

2024-01-29

我正在尝试在 C++ 端的 Java 方法调用上显示 toast 我已经设法调用该方法,甚至获取字符串,但 Toast 不起作用我已经尝试了几乎所有与上下文相关的内容

C++ Side

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);

爪哇端

  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 没有显示任何内容

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


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

这是 C++ 中 Java 方法的 JNI 调用中的问题。我不得不打电话给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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过在 qt 中从 c++ JNI 发送字符串来在 Android 中显示 Toast 的相关文章

随机推荐