本文基于QT6作为框架架构进行开发和学习。目前大部分学习资料都是以QT5为基础进行讲解和开发,而基于QT6关于安卓的开发相对较少。目前QT6关于android的开发相较于QT5来说,有了很大的变化,在QT5中,完全依赖于 androidextras模块的内容对android进行应用,所依赖的对象结结构是QAndroidJniObject,而在QT6中,已经将androidextras模块的移植到到core模块中,但同时,仍然依赖于缺失功能的客户端可以包括私有标头
QT 想要调用 android 的方法少不了 QAndroidJniObject
这个类,而在QT6中,QAndroidJniObject 和 QAndroidJniEnvironment
已经更改为QJniObject和QJniEnvironment,QT 官方文档对它有充分的解释说明::QJniObject Class | Qt Core 6.5.2
本篇文章是专栏系列的基础,只要学会 QJniObject的使用,Qt for Android 就掌握大半了。QJniObject属于 core模块,要使用它,需要在 pro 文件中加入下面的代码:
QT += core
Cmake的要加入下面代码:
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
下面我们来梳理一下QT6关于android开发封装的相关知识和对比。
本章节通过QT调用方式与java函数原型的对比,来说明QT是如何调用调用android系统指令以及Java开发的函数库之间调用关系。
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
public void testInt(int i)
{
Log.i(CLASS_NAME, "testInt:" + i);
}
}
QT调用方式
//QT6编写方式
#include
int parm = 0;
QJniObject obj("org/qtproject/testDemo/SystemInfo");
obj.callMethod("testInt", "(I)V", parm);
/***************************************************/
//QT5编写方式
#include"QtAndroid"
int parm = 0;
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
obj.callMethod("testInt", "(I)V", parm);
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
public void testString(String str)
{
Log.i(CLASS_NAME, "testString:" + str);
}
}
QT 调用方式
//QT6编写方式
#include
QString parm = "this is QString";
QJniObject strObj = QAndroidJniObject::fromString(parm);
QJniObject obj("org/qtproject/testDemo/SystemInfo");
obj.callMethod("testString","(Ljava/lang/String;)V", strObj.object());
/***************************************************/
//QT5编写方式
#include"QtAndroid"
QString parm = "this is QString";
QAndroidJniObject strObj = QAndroidJniObject::fromString(parm);
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
obj.callMethod("testString","(Ljava/lang/String;)V", strObj.object());
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
public int testInt_I()
{
Log.i(CLASS_NAME, "testInt_I:void");
return 3;
}
public int testInt_I(int i)
{
Log.i(CLASS_NAME, "testInt_I:" + i);
return i;
}
}
QT 调用方式
//QT6编写方式
#include
///无参数
QJniObject obj("org/qtproject/testDemo/SystemInfo");
const int value = obj.callMethod("testInt_I", "()I");
//参数为int
int parm = 0;
QJniObject obj("org/qtproject/testDemo/SystemInfo");
const int value = obj.callMethod("testInt_I", "(I)I", parm);
/***************************************************/
//QT5编写方式
#include"QtAndroid"
///无参数
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
const int value = obj.callMethod("testInt_I", "()I");
//参数为int
int parm = 0;
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
const int value = obj.callMethod("testInt_I", "(I)I", parm);
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
String result="SystemInfo";
public String testString()
{
Log.i(CLASS_NAME, "testString");
return result;
}
}
QT 调用方式
//QT6编写方式
#include
///无参数
QJniObject obj("org/qtproject/testDemo/SystemInfo");
QJniObject Result = obj.callObjectMethod("testString","()Ljava/lang/String;");
qDebug() << "testString:" << Result.toString();
/***************************************************/
//QT5编写方式
#include"QtAndroid"
///无参数
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
QAndroidJniObject Result = obj.callObjectMethod("testString","()Ljava/lang/String;");
qDebug() << "testString:" << Result.toString();
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
String result="SystemInfo";
public String testString_I(int i)
{
Log.i(CLASS_NAME, "testString" + i);
return result;
}
}
QT 调用方式
//QT6编写方式
#include
int pram = 3;
QJniObject obj("org/qtproject/testDemo/SystemInfo");
QJniObject Result = obj.callObjectMethod("testString","(I)Ljava/lang/String;",pram);
qDebug() << "testString:" << Result.toString();
/***************************************************/
//QT5编写方式
#include"QtAndroid"
int pram = 3;
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
QAndroidJniObject Result = obj.callObjectMethod("testString","(I)Ljava/lang/String;",pram);
qDebug() << "testString:" << Result.toString();
java 函数原型
package org.qtproject.testDemo;
import android.util.Log;
public class SystemInfo {
public static String CLASS_NAME = "SystemInfo";
String result="SystemInfo";
public String testString(String str)
{
Log.i(CLASS_NAME, "testString" + str);
return str;
}
}
QT 调用方式
//QT6编写方式
#include
QJniObject obj("org/qtproject/testDemo/SystemInfo");
QString param = "this is android";
QJniObject paramobj = QJniObject::fromString(param);
QJniObject Result = obj.callObjectMethod("testString","(Ljava/lang/String;)Ljava/lang/String;",paramobj.object();
qDebug() << "testString:" << Result.toString();
/***************************************************/
//QT5编写方式
#include"QtAndroid"
QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
QString param = "this is android";
QAndroidJniObject paramobj = QAndroidJniObject::fromString(param);
QAndroidJniObject Result = obj.callObjectMethod("testString","(Ljava/lang/String;)Ljava/lang/String;",paramobj.object();
qDebug() << "testString:" << Result.toString();
QT6的写法相较于QT5来说,只是结构名称的变化,用法都是一样的,只是QT6目前关于android开发相关的库模块转到新的模块中去了,可以查看QT6的帮助文档具体查看,以上第二小节,主要是介绍QT是如何实现与Java之间的调用关系,非常重要,掌握了以上调用方法,基本上可以进行相关android程序的开发以及读懂相关代码逻辑了。