- p中引入安卓拓展模块 QT += andidextras 。p中指定安卓打包目录 ANDROID_PACKAGE_SOCE_DIR = $$PWD/andid 指定引入安卓特定目录比如程序标、变量、颜、java代码文件、jar库文件等。
- 每个程序的一个全配置文件,里面xml格式的数据,标明支持的安卓版本、标位置、横屏竖屏、权限等。这个文件是关键的,如果没有这个文件则Qt会默认生成一个。andid/res/drawable-hdpi drawable-hdpi 等目录下存放的是应用程序标。andid/res/layout 目录下存放的布文件。andid/res/value存储的一些变量值。andid/libs 目录下存放的jar库文件。andid/src 目录下存放的java代码文件,可以是根据包名建立的一层层子目录,也可以直接在src目录下。目录自行搜索安卓目录规范。后面的说明统一用的andid目录举例,其实你可以改成任意目录,比如你的代码目录下是xxoo存放的安卓相关的打包文件,你就写成 ANDROID_PACKAGE_SOCE_DIR = $$PWD/xxoo 。
- java类名必须和文件名一致,区分大小写。java类必须在andid/src目录下不然不会打包到apk文件,可以是子目录比如 andid/src/com/qt 。Qt代码中的QAndidJniObject指定传入的java包名,必须严格和java文件package一致,不然程序执行到此处会因为找不到而崩溃。
- andid/scr/MainActivity.java 顶部 没有 package 则代码中必须是 QAndidJniObject javaClass(“MainActivity”);andid/scr/MainActivity.java 顶部 package com.qandid; 则代码中必须是 QAndidJniObject javaClass(“com/qandid/MainActivity”);andid/scr/com/example/MainActivity.java 顶部 package com.qandid; 则代码中必须是 QAndidJniObject javaClass(“com/qandid/MainActivity”);andid/scr/com/example/MainActivity.java 顶部 package 则代码中必须是 QAndidJniObject javaClass(“com/qandid/example/MainActivity”);总之这个包名是和代码中的package后面一段吻合,而不是目录路径。为了统一方便查找文件,建议包名和目录路径一致。
- Qt只能Qt内部类的事情,做一些简单的UI交互还是非常方便,如果涉及到底层操作,还是需要熟悉java会如虎添翼,一般的做法就是写好java文件调试好,提供静态方法给Qt调用,这样通过QAndidJniObject这个胶水可以做到Qt程序调用java中的函数并拿到执行结果,也可以接收java中的函数。p中通过 OTHER_FI += andid+= andid/src/JniMessenger.java 引入文件其实对整个程序的编译打包没有影响,就是为了方便在QtCreator中查看和编辑。在Qt中与安卓的java文件交互都是用的QAndidJniObject,可以执行java类中的普通函数、静态函数,可以传类对象jclass、类名className、方法methodName、参数,也可以拿到执行结果返回值。 (I)V括中的是参数类型,括后面的是返回值类型,void返回值对应V,由于Stng在java中不是数据类型而是类,所以要用Ljava/lang/Stng;表示,类作为参数也是这样处理。
- 调用实例方法:callMethod、callObjectMethod。调用静态方法:callStaticMethod、callStaticObjectMethod。不带Object的函数名用来执行无返回值或者常规返回值int、float等的方法。如果返回值是Stng或者类则需要用带Object的函数名来执行,返回QAndidJniObject类型再转换处理拿到结果,比如toStng拿到字符串。
- 各种参数和返回值示例。
package org.qt; import org.qt.QtAndidData; public class QtAndid { //需要通过实例来调用 发现不论 pvate public 或者不写都可以调用 我擦 pvate void pntText { ("pntText"); } public static void pntMsg { ("pntMsg"); } public static void pntValue(int value) { ("pntValue:" + value); } public static void setValue(float value1, double value2, char value3) { ("value1:" + value1 + " value2:" + value2 + " value3:" + value3); } public static int getValue { retn ; } public static int getValue(int value) { retn value + 1; } public static void setMsg(Stnessage) { ("setMsg:" + message); } public static Stng getMsg { retn "hello fm java"; } public static void setText(int value1, float value2, boolean value3, Stnessage) { ("value1:" + value1 + " value2:" + value2 + " value3:" + value3 + " message:" + message); } public static Stng getText(int value1, float value2, boolean value3, Stnessage) { //同时演示触发静态函数发给Qt ("message", "你好啊 java"); //下面两种办法都可以拼字符串 retn "value1:" + value1 + " value2:" + value2 + " value3:" + value3 + " message:" + message; //retn "value1:" + (value1) + " value2:" + (value2) + " value3:" + (value3) + " message:" + message; } } ``` ```cpp #include "" //java类对应的包名+类名 #define className "org/qt/QtAndid" void Andid:: { jint a = 12; jint b = 4; //可以直接调用java内置类中的方法 jint x = QAndidJniObject::callStaticMethod<jint>("java/lang/Math", "x", "(II)I", a, b); //jclass javaMathClass = "java/lang/Math"; jdouble value = QAndidJniObject::callStaticMethod<jdouble>("java/lang/Math", "random"); qDebug << "111" << x << value; } void Andid::pntText { QAndidJniEnvinment env; jclass clazz = (className); QAndidJniObject obj(clazz); <void>("pntText"); } void Andid::pntMsg { #if 0 //查看源码得知不传入jclass类的函数中内部会自动根据类名查找jclass QAndidJniEnvinment env; jclass clazz = (className); QAndidJniObject::callStaticMethod<void>(clazz, "pntMsg"); #else //没有参数和返回值可以忽略第三个参数 QAndidJniObject::callStaticMethod<void>(className, "pntMsg"); //QAndidJniObject::callStaticMethod<void>(className, "pntMsg", "V"); #endif } void Andid::pntValue(int value) { QAndidJniObject::callStaticMethod<jint>(className, "pntValue", "(I)I", (jint)value); } void Andid::setValue(float value1, double value2, char value3) { QAndidJniObject::callStaticMethod<void>(className, "setValue", "(FDC)V", (jfloat)value1, (jdouble)value2, (jchar)value3); } int Andid::getValue(int value) { //java类中有两个 getValue 函数 一个需要传参数 //jint result = QAndidJniObject::callStaticMethod<jint>(className, "getValue"); jint result = QAndidJniObject::callStaticMethod<jint>(className, "getValue", "(I)I", (jint)value); retn result; } void Andid::setMsg(const QStng &msg) { QAndidJniObject jmsg = QAndidJniObject::fmStng(msg); QAndidJniObject::callStaticMethod<void>(className, "setMsg", "(Ljava/lang/Stng;)V", <jstng>); } QStng Andid::getMsg { QAndidJniObject result = QAndidJniObject::callStaticObjectMethod(className, "getMsg", "Ljava/lang/Stng;"); retn ; } void Andid::setText(int value1, float value2, bool value3, const QStng &msg) { QAndidJniObject jmsg = QAndidJniObject::fmStng(msg); QAndidJniObject::callStaticMethod<void>(className, "setText", "(IFZLjava/lang/Stng;)V", (jint)value1, (jfloat)value2, (oolean)value3, <jstng>); } QStng Andid::getText(int value1, float value2, bool value3, const QStng &msg) { QAndidJniObject jmsg = QAndidJniObject::fmStng(msg); QAndidJniObject result = QAndidJniObject::callStaticObjectMethod(className, "getText", "(IFZLjava/lang/Stng;)Ljava/lang/Stng;", (jint)value1, (jfloat)value2, (oolean)value3, <jstng>); retn ; }
- 在原生Andid中,不同页面会定义不同的Activity。但使用Qt Quick、Flutter等采用Direct UI方式实现的第三方框架则只定义了一个Activity。里面不同页面实际都是使用OpenGL等直接绘制的。
作品37-安卓综合应用示例
本文来自投稿,不代表记事本立场,如若转载,请注明出处:https://www.buy373.com/934.html