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

Posted

技术标签:

【中文标题】如何使用 QAndroidJniObject 从 Qt 内部调用 Java 代码?【英文标题】:How to use QAndroidJniObject to call Java code from inside Qt? 【发布时间】:2014-11-23 20:45:37 【问题描述】:

从一个使用 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);
    

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

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

我应该将 Java 代码放在我的项目中的什么位置,call_HelloJava_sayHello() 方法中的内容是什么?

【问题讨论】:

另外,这是前几天发布的:kdab.com/qt-android-episode-5 【参考方案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:这个变量可以用来指定一个 可以对默认值进行添加和修改的目录 安卓包模板。 androiddeployqt 工具将复制 应用程序模板从 Qt 到 build 目录,然后它 将 ANDROID_PACKAGE_SOURCE_DIR 的内容复制到 这会覆盖任何现有文件。更新步骤,其中部分 源文件会自动修改以反映您的其他 然后在生成的合并包上运行设置。如果你,对于 例如,想为您制作一个自定义的 AndroidManifest.xml 应用程序,然后将其直接放入指定的文件夹中 这个变量。您还可以在其中添加自定义 Java 文件 ANDROID_PACKAGE_SOURCE_DIR/src。

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

看来您需要指定它,然后自动部署 java 文件。

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

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

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

【讨论】:

你能告诉我应该把Java类放在哪里吗?因为当我将我的库用作 AAR android lib 项目的一部分并从 AAR 项目中调用 Class 时,QAndroidJniObject 失败且未打印错误? 如果您有时间来这里看看,我将非常感激:***.com/questions/64461847/…

以上是关于如何使用 QAndroidJniObject 从 Qt 内部调用 Java 代码?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 和 Android Gallery - 使用 QAndroidJniObject 的 MediaStore

QAndroidJniObject::callMethod() 和 QAndroidJniObject::callObjectMethod() 有啥区别?

无法使用 QAndroidJniObject 调用 PowerManager.WakeLock.newWakeLock

操作 QAndroidJniObject 数组

如何从 Qt Android 使手机振动

当我使用Qt Android Extras C ++ Classes时,如何防止Windows上的错误