如何使用 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() 有啥区别?