2014-03-07 50 views
3

我想顯示在從C++方面的Java方法調用吐司 我設法調用該方法,甚至獲得字符串,但吐司不工作我已經嘗試過一切與上下文和所有在Android中通過發送字符串從c + + JNI在qt中顯示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(); 

}

我在消息剛開的字符串值,但這吐司不顯示任何

任何想法,將不勝感激..thanks

+0

你是否從主UI線程調用了toast方法? –

+0

不,但我有活動的上下文... –

+0

沒關係,你不能修改除主線程以外的任何線程的UI,這就是爲什麼不顯示,只需調用Toast.make ...從runOnUIThread或處理程序,它會顯示... –

回答

4

深入分析我的代碼後,我在我的代碼想通了這個問題。希望這個答案對將來的人有所幫助。

這是java中java方法在JNI調用中的問題。我必須像在JNI中一樣調用DetachCurrentThread(),本地線程仍然連接到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(); 
相關問題