簡體   English   中英

在qt中從c ++調用java方法

[英]calling java method from c++ in qt

我正在嘗試使用 QAndroidJniObject 在 c++ qt 中調用在 android 活動中定義的方法。 這是我在 C++ 類中的調用

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

這個 appData 是在 appActiviy android 類中定義的,它返回一個字符串,這是我想調用並獲取返回的字符串值的定義方法

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

但我得到 null 是 dataValue 並且它也沒有拋出任何錯誤。

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

Qt 文檔

處理 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嗎?

以下是一些想法:

  1. 您是否使用 Log.d() 在返回之前打印字符串以確保它不為空?

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

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

  4. 我在 Android 文檔的 com/android/app/appActivity 中找不到任何類。 你的意思是 com/android/app/Activity 嗎? 如果是這樣,我在這里找不到名為“appData”的方法。

謝謝各位大俠的解答,終於搞明白了。 這很簡單然后我正在嘗試

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 方法的返回類型。 我想這是我最后的愚蠢錯誤......再次感謝

我今天也有同樣的問題。 雖然它和你的代碼不同,但返回值也是NULL。這是我的代碼:

package org.test.project.test;
public class TestJava {
        public static String notify(int iNumber )
        {
            String strNum = iNumber+"";
            return strNum;
        }
}

然后是C++代碼:

QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("org/test/project/test/TestJava",
                                              "notify",
                                              "(I)Ljava/lang/String;",
                                              m_iNumber);
//the str always been NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM