【问题标题】:How to use QAndroidJniObject to call Java code from inside Qt?如何使用 QAndroidJniObject 从 Qt 内部调用 Java 代码?
【发布时间】: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() 方法中的内容是什么?

【问题讨论】:

标签: android c++ qt qandroidjniobject


【解决方案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 失败且未打印错误?
  • 如果您有时间来这里看看,我将非常感激:stackoverflow.com/questions/64461847/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多