在Qt中从C ++调用Java方法

calling java method from c++ in qt

本文关键字:调用 Java 方法 Qt 中从      更新时间:2023-10-16

我正在尝试使用 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;
}

但我得到的空是数据值,它也不会抛出任何错误。

您可能需要手动检查异常才能获取 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