1

我从这个问题中编写了以下代码,它被编译并完美运行:

QAndroidJniObject str =  QAndroidJniObject::callStaticObjectMethod<jstring>(
                               "org/.../TestClass"
                               ,"staticMethod");

现在我更改了 java 方法,它需要一个字符串类型的输入参数。

Java代码

public class TestClass{
    public string str;
    public TestClass() {
        str = "Test From Java";
    }
    public static String staticMethod(String str) {
        return "Test From Java, "+str;
    }
}

但是添加方法签名和输入参数对我不起作用。我编写了这段代码来使用 JNI 在提到的 java 类中调用静态方法:

QAndroidJniObject val = QAndroidJniObject::fromString("Test String");
QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod<jstring>(
          "org/.../TestClass"
          ,"staticMethod"
          ,"(Ljava/lang/String;)Ljava/lang/String;"
          ,val.object<jstring>());

但是 Qt creator 没有构建它,打印了这个错误:

...testclass.cpp:21: error:
no matching function for call to 'QAndroidJniObject::callStaticObjectMethod(
const char [36], const char [13], const char [39], _jstring*)'
                                                        ,val.object<jstring>());
                                                                              ^

谢谢你的帮助。

我也试过 callStaticMethod

为了这:

jstring str = QAndroidJniObject::callStaticMethod<jstring>(
                      "org/.../TestClass"
                      ,"staticMethod"
                      ,"(Ljava/lang/String;)Ljava/lang/String;"
                      ,val.object<jstring>());

我收到以下错误:

...\testclass.cpp:21: 错误:未定义引用 '_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...)'

## 我也试过没有模板参数的 callStaticObjectMethod ##

QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("org/...TextClass" ,"staticMethod" ,"(Ljava/lang/String;)Ljava/lang/String;",val.object());

它总是返回一个空字符串。我不确定它是否真的是空的。我qCritical() << str.toString();用来打印字符串,但随后打印了一个空的 qout!

4

1 回答 1

3

尝试:

QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod(
          "org/.../TestClass"
          ,"staticMethod"
          ,"(Ljava/lang/String;)Ljava/lang/String;"
          ,val.object<jstring>());

我认为这个函数不带模板参数。

比你能做的:

str.toString() //returns QString

并确保您已将 Java 源文件导入到您的 android 构建中。例如,如果您的 java 类位于android-sources文件夹下,请将其添加到您的 .pro 文件中:

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
于 2015-02-24T13:02:44.923 回答