Android 通过从c++;qt中的JNI 我试图在C++的java方法调用中显示一个敬语 我已经成功地调用了这个方法,甚至得到了字符串,但是Toast不起作用。我尝试了几乎所有与上下文和所有

Android 通过从c++;qt中的JNI 我试图在C++的java方法调用中显示一个敬语 我已经成功地调用了这个方法,甚至得到了字符串,但是Toast不起作用。我尝试了几乎所有与上下文和所有,android,c++,qt,java-native-interface,Android,C++,Qt,Java Native Interface,C++端 JavaVMAttachArgs args = { JNI_VERSION_1_6, NULL, NULL }; vm->AttachCurrentThread( &env, &args ); activityConstructor = env->GetMethodID(activity, "<init>", "()V"); jobject object = env->NewObject(activity, activityConstru

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语言中C++调用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();
JavaVMAttachArgs args={JNI_VERSION_1_6,NULL,NULL};
vm->AttachCurrentThread(&env,&args);
activityConstructor=env->GetMethodID(活动“,”()V”);
jobject object=env->NewObject(活动、活动构造函数);
toastID=env->GetMethodID(活动,“toast”,“(Ljava/lang/String;)V”);
qDebug()NewStringUTF(“这来自jni”);
qDebug()拆下CurrentThread();

您是从主UI线程调用toast方法吗?不是,但我有活动的上下文…没关系,您不能从主线程以外的任何线程修改UI,这就是为什么没有显示,只需调用toast。制作。。。从runOnUIThread或处理程序,它将显示…嗯…我在上面的代码中更改了toast方法…但它仍然不起作用..你能看到其中的任何问题..你收到日志消息了吗?
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();