QT6 for android 开发--Java及其android基础知识篇

一.前言

本文基于QT6作为框架架构进行开发和学习。目前大部分学习资料都是以QT5为基础进行讲解和开发,而基于QT6关于安卓的开发相对较少。目前QT6关于android的开发相较于QT5来说,有了很大的变化,在QT5中,完全依赖于 androidextras模块的内容对android进行应用,所依赖的对象结结构是QAndroidJniObject,而在QT6中,已经将androidextras模块的移植到到core模块中,但同时,仍然依赖于缺失功能的客户端可以包括私有标头作为权宜解决方案。要启用私有头,请在qmake中添加使用QT +=core-private,或者在CMake中添加Qt::CorePrivate,这样就可以启用QT6中关于android的开发项目。

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调用方式基础

本章节通过QT调用方式与java函数原型的对比,来说明QT是如何调用调用android系统指令以及Java开发的函数库之间调用关系。

2.1 调用参数为基础类型的无返回值的成员函数

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);

2.2 调用参数为对象的无返回值的成员函数

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());

2.3 调用返回值为基础类型的成员函数

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);

2.4 调用返回值为对象类型的成员函数

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();


2.5 调用返回值为对象类型参数为基础类型的成员函数

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();

2.6 调用返回值为对象类型参数为对象类型的成员函数

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程序的开发以及读懂相关代码逻辑了。

你可能感兴趣的:(QT6,for,android开发,qt,android)