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

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

但是我得到的dataValue为null,而且也没有抛出任何错误。


dataValedataValue不匹配。(可能只是一个抄写错误?) - Alex P
它应该给我语法错误,但是我检查过了,并不是这种情况。 - JNI_OnLoad
4个回答

3
你可能需要手动检查异常以获取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 吗?


2

以下是一些想法:

  1. 你使用了Log.d()方法打印字符串之前,是否确认其不为空?

  2. 虽然可能没有影响,但你在参数中指定了一个整数,而Java方法的签名中并没有包含它。因此,你应该将此整数作为参数提供给callStaticObjectMethod()方法。

  3. 正如Alex P所提到的,异常必须进行处理,否则可能会经常发生并导致整个应用程序崩溃,让你很头疼。

  4. 我在Android文档中找不到com/android/app/appActivity类。你是否指的是com/android/app/Activity?如果是这样,我找不到一个名为“appData”的方法(这里)


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;"。 - uniquenamehere

-1

我今天遇到了同样的问题。虽然我的代码与你的不同,但返回值也是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接