通过从 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的主要内容,如果未能解决你的问题,请参考以下文章
通过从我的数据库表中发送用户名和密码来登录 Facebook
如何通过从vuejs组件获取数据在Laravel控制器中创建多个行