2014-02-08 65 views
3

我想調用一個方法在c + + qt中使用QAndroidJniObject在android活動中定義。 這是我在C調用++類從qt調用java方法從c +

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", 
                     "appData", 
                     "(I)Ljava/lang/String;"); 
QString dataValue = data.toString(); 
qDebug() <<"Data is " << dataValue; 

這個應用程序數據在appActiviy安卓類中定義的,它返回一個字符串 這種定義方法,我要打電話,並得到返回的字符串值

static String appData(){ 
    Log.d("App Data is ", "Working"); 
    return data; 
} 

但是我得到的是dataValue,它不會拋出任何錯誤。

+0

'dataVale'和'dataValue'不匹配。(可能只是一個轉錄錯誤?) –

+0

它應該給我語法錯誤...但我檢查它並非如此 –

回答

0

謝謝你們的回答,最後我想通了。這是簡單的方式,然後我試圖

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", 
                    "appData", 
                    "(I)Ljava/lang/String;"); 

在這段代碼我不知道這意味着(I)Ljava/lang/String;你的Java方法接受參數的類型,但在我的情況下,什麼都沒有。所以正確答案是

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod<jstring>("com/android/app/appActivity", 
                    "appData")` 

表示我定義的java方法的返回類型。 我想這是從我的結尾愚蠢的錯誤...再次感謝

+1

這就是我在2.在我的答案中所說的。很高興你想出來了。你也可以使用簽名:「()Ljava/lang/String;」 – Phat

3

您可能需要手動檢查異常以獲取Java錯誤。

Qt documentation

處理Java異常

當調用可能拋出異常的Java功能,您檢查,處理,並在繼續之前清除異常是很重要的。

注意:當有異常待處理時進行JNI調用是不安全的。

void functionException() 
{ 
    QAndroidJniObject myString = QAndroidJniObject::fromString("Hello"); 
    jchar c = myString.callMethod<jchar>("charAt", "(I)C", 1000); 
    QAndroidJniEnvironment env; 
    if (env->ExceptionCheck()) { 
     // Handle exception here. 
     env->ExceptionClear(); 
    } 
} 

你確定你想叫com/android/app/appActivity,而不是com/android/app/Activity

2

這裏有一些想法:

  1. 你用Log.d()的返回確保它不爲空,提前打印字符串?

  2. 不確定是否重要,但是您指定了一個整數作爲參數,但Java方法在其簽名中沒有。然後應該在callStaticObjectMethod()中提供此整數作爲參數。

  3. 正如Alex P所述,必須處理異常,否則它們會讓您頭痛,因爲它們可能會經常發生並使整個應用程序崩潰。

  4. 我在Android文檔的com/android/app/appActivity中找不到任何類。你是不是指com/android/app/Activity?如果是這樣,我找不到名爲「appData」here的方法。