如何使用QAndroidJniObject从Qt内部调用Java代码?

时间:2014-11-23 20:45:37

标签: android c++ qt qandroidjniobject

从使用Qt Creator创建的空Qt for Android项目开始,我该如何执行本机Java代码?

例如,如果我有这个java方法:

class HelloJava {
    public static String sayHello(int a, int b) {
        return "Hello from Java, a+b=" + (a+b);
    }
}

我有这个Qt方法应该调用HelloJava.sayHello()方法:

QString call_HelloJava_sayHello(int a, int b) {
    // What goes in here?
}

我在哪里将Java代码放在我的项目中,以及call_HelloJava_sayHello()方法中的内容是什么?

1 个答案:

答案 0 :(得分:1)

Qt doc在这个问题上非常冗长:

// Java class
package org.qtproject.qt5;
class TestClass
{
   static String fromNumber(int x) { ... }
   static String[] stringArray(String s1, String s2) { ... }
}


// C++ code

// The signature for the first function is "(I)Ljava/lang/String;"
QAndroidJniObject stringNumber = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                           "fromNumber"
                                                                           "(I)Ljava/lang/String;",
                                                                           10);

// the signature for the second function is "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());

所以你的函数的签名应该是"(I;I;)Ljava/lang/String;"

还有这个:

  

ANDROID_PACKAGE_SOURCE_DIR:此变量可用于指定a   可以对默认值进行添加和修改的目录   Android包模板。 androiddeployqt工具将复制   应用程序模板从Qt进入构建目录,然后再进行构建   将复制ANDROID_PACKAGE_SOURCE_DIR的内容   这样,覆盖任何现有文件。部分更新步骤   源文件会自动修改以反映您的其他文件   然后在生成的合并包上运行设置。如果你,为   实例,想为你的自定义AndroidManifest.xml   应用程序,然后将其直接放入指定的文件夹中   这个变量。您还可以添加自定义Java文件   ANDROID_PACKAGE_SOURCE_DIR / SRC。

     

注意:添加构建文件的自定义版本(例如   strings.xml,libs.xml,AndroidManifest.xml等)到你的项目中,   确保从包中的模板中复制它们   $ QT / src目录/安卓/ JAVA。您永远不应该从构建中复制任何文件   目录,因为这些文件已被更改以匹配当前构建   设置。

因此,您似乎需要指定并自动部署java文件。

只需将其添加到.pro文件中(假设您的java源位于/path/to/project/myjava/src

android {
    ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
    QT += androidextras
}

_PRO_FILE_PWD_是一个qmake变量,将解析为项目目录。