通过在QT中从C ++ JNI发送字符串在Android中显示吐司

 2023-01-21    271  

问题描述

我正在尝试在C ++侧的Java方法调用上显示敬酒
我已经设法称呼该方法,甚至得到字符串,但吐司行不通,我尝试了几乎所有用上下文和所有

尝试

通过在QT中从C ++ JNI发送字符串在Android中显示吐司

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

java side

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

}

我在消息中gettin string值,但此吐司没有显示任何内容

任何想法都将不胜感激.

推荐答案

深入分析我的代码后,我在代码中弄清楚了问题.希望这个答案对将来的人有所帮助.

这是JNI呼叫中的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中显示吐司,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26221.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。