沐鸣娱乐


        Qt安卓开发经验001-010(qt 安卓开发)

        1. pro中引入安卓拓展模块 Qt = androidsextras 。
        2. pro中指定安卓打包目录 androids_PACKAGE_SOURCE_DIR = $$PWD/androids 指定引入安卓特定目录比如程序图标、变量 、颜色、java代码文件 、jar库文件等。
        • androidsManifest.xml 每个程序唯一的一个全局配置文件 ,里面xml格式的数据 ,标明支持的安卓版本、图标位置、横屏竖屏、权限等 。这个文件是最关键的 ,如果没有这个文件则Qt会默认生成一个。
        • androids/res/drawable-hdpi drawable-xxxhdpi 等目录下存放的是应用程序图标 。
        • androids/res/layout 目录下存放的布局文件。
        • androids/res/values/libs.xml 存储的一些变量值。
        • androids/libs 目录下存放的jar库文件 。
        • androids/src 目录下存放的java代码文件,可以是根据包名建立的一层层子目录,也可以直接在src目录下。
        • 其他目录自行搜索安卓目录规范。
        • 后面的说明统一用的androids目录举例,其实你可以改成任意目录,比如你的代码目录下是xxoo存放的安卓相关的打包文件,你就写成 androids_PACKAGE_SOURCE_DIR = $$PWD/xxoo  。
        1. java类名必须和文件名完全一致,区分大小写。
        2. java类必须在androids/src目录下不然不会打包到apk文件,可以是子目录比如 androids/src/com/qt 。
        3. Qt代码中的QandroidsJniObject指定传入的java包名,必须严格和java文件package完全一致,不然程序执行到此处会因为找不到而崩溃。
        • androids/scr/MainActivity.java 顶部 没有 package 则代码中必须是 QandroidsJniObject javaClass("MainActivity");
        • androids/scr/MainActivity.java 顶部 package com.qandroids; 则代码中必须是 QandroidsJniObject javaClass("com/qandroids/MainActivity");
        • androids/scr/com/example/MainActivity.java 顶部 package com.qandroids; 则代码中必须是 QandroidsJniObject javaClass("com/qandroids/MainActivity");
        • androids/scr/com/example/MainActivity.java 顶部 package com.example.qandroids; 则代码中必须是 QandroidsJniObject javaClass("com/qandroids/example/MainActivity");
        • 总之这个包名是和代码中的package后面一段吻合,而不是目录路径。为了统一管理方便查找文件,建议包名和目录路径一致。
        1. Qt只能干Qt内部类的事情 ,做一些简单的UI交互还是非常方便,如果涉及到底层操作,还是需要熟悉java会如虎添翼,一般的做法就是写好java文件调试好 ,提供静态方法给Qt调用,这样通过QandroidsJniObject这个万能胶水可以做到Qt程序调用java中的函数并拿到执行结果,也可以接收java中的函数 。
        2. pro中通过 OTHER_FILES = androids/androidsManifest.xml OTHER_FILES = androids/src/JniMessenger.java 引入文件其实对整个程序的编译打包没有任何影响,就是为了方便在QtCreator中查看和编辑。
        3. 在Qt中与安卓的java文件交互都是用万能的QandroidsJniObject,可以执行java类中的普通函数 、静态函数,可以传类对象jclass、类名className、方法methodName 、参数,也可以拿到执行结果返回值。 (I)V括号中的是参数类型 ,括号后面的是返回值类型,void返回值对应V,由于String在java中不是数据类型而是类 ,所以要用Ljava/lang/String;表示,其他类作为参数也是这样处理。
        • 调用实例方法:callMethod、callObjectMethod。
        • 调用静态方法:callstaticMethod、callStaticObjectMethod 。
        • 不带Object的函数名用来执行无返回值或者常规返回值int、float等的方法 。
        • 如果返回值是String或者类则需要用带Object的函数名来执行,返回QandroidsJniObject类型再转换处理拿到结果 ,比如toString拿到字符串。
        1. 各种参数和返回值示例。

        package org.qt;import org.qt.QtandroidsData;public class QtandroidsTest{ //需要通过实例来调用 测试发现不论 private public 或者不写都可以调用 我擦 private void printText() { System.out.println("printText"); } public static void printMsg() { System.out.println("printMsg"); } public static void printValue(int value) { System.out.println("printValue:" value); } public static void setValue(float value1, double value2, char value3) { System.out.println("value1:" value1 " value2:" value2 " value3:" value3); } public static int getValue() { return 65536; } public static int getValue(int value) { return value 1; } public static void setMsg(String message) { System.out.println("setMsg:" message); } public static String getMsg() { return "hello from java"; } public static void setText(int value1, float value2, boolean value3, String message) { System.out.println("value1:" value1 " value2:" value2 " value3:" value3 " message:" message); } public static String getText(int value1, float value2, boolean value3, String message) { //同时演示触发静态函数发给Qt QtandroidsData.receiveData("message", "你好啊 java"); //下面两种办法都可以拼字符串 return "value1:" value1 " value2:" value2 " value3:" value3 " message:" message; //return "value1:" String.valueOf(value1) " value2:" String.valueOf(value2) " value3:" String.valueOf(value3) " message:" message; }}``````cpp#include "androidstest.h"//java类对应的包名 类名#define className "org/qt/QtandroidsTest"void androidsTest::test(){ jint a = 12; jint b = 4; //可以直接调用java内置类中的方法 jint max = QandroidsJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b); //jclass javaMathClass = "java/lang/Math"; jdouble value = QandroidsJniObject::callStaticMethod<jdouble>("java/lang/Math", "random"); qDebug() << "111" << max << value;}void androidsTest::printText(){ QandroidsJniEnvironment env; jclass clazz = env.findClass(className); QandroidsJniObject obj(clazz); obj.callMethod<void>("printText");}void androidsTest::printMsg(){#if 0 //查看源码得知不传入jclass类的函数中内部会自动根据类名查找jclass QandroidsJniEnvironment env; jclass clazz = env.findClass(className); QandroidsJniObject::callStaticMethod<void>(clazz, "printMsg");#else //没有参数和返回值可以忽略第三个参数 QandroidsJniObject::callStaticMethod<void>(className, "printMsg"); //QandroidsJniObject::callStaticMethod<void>(classNameTest, "printMsg", "()V");#endif}void androidsTest::printValue(int value){ QandroidsJniObject::callStaticMethod<jint>(className, "printValue", "(I)I", (jint)value);}void androidsTest::setValue(float value1, double value2, char value3){ QandroidsJniObject::callStaticMethod<void>(className, "setValue", "(FDC)V", (jfloat)value1, (jdouble)value2, (jchar)value3);}int androidsTest::getValue(int value){ //java类中有两个 getValue 函数 一个需要传参数 //jint result = QandroidsJniObject::callStaticMethod<jint>(className, "getValue"); jint result = QandroidsJniObject::callStaticMethod<jint>(className, "getValue", "(I)I", (jint)value); return result;}void androidsTest::setMsg(const QString &msg){ QandroidsJniObject jmsg = QandroidsJniObject::fromString(msg); QandroidsJniObject::callStaticMethod<void>(className, "setMsg", "(Ljava/lang/String;)V", jmsg.object<jstring>());}QString androidsTest::getMsg(){ QandroidsJniObject result = QandroidsJniObject::callStaticObjectMethod(className, "getMsg", "()Ljava/lang/String;"); return result.toString();}void androidsTest::setText(int value1, float value2, bool value3, const QString &msg){ QandroidsJniObject jmsg = QandroidsJniObject::fromString(msg); QandroidsJniObject::callStaticMethod<void>(className, "setText", "(IFZLjava/lang/String;)V", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>());}QString androidsTest::getText(int value1, float value2, bool value3, const QString &msg){ QandroidsJniObject jmsg = QandroidsJniObject::fromString(msg); QandroidsJniObject result = QandroidsJniObject::callStaticObjectMethod(className, "getText", "(IFZLjava/lang/String;)Ljava/lang/String;", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>()); return result.toString();}

        1. 在原生androids开发中,不同页面会定义不同的Activity 。但使用Qt Quick、Flutter等采用Direct UI方式实现的第三方开发框架则只定义了一个Activity。里面不同页面实际都是使用OpenGL等直接绘制的。https://blog.csdn.net/LCSENs/article/details/100182235

        项目作品37-安卓综合应用示例 https://qtchina.blog.csdn.net/article/details/123940153

        相关新闻

        联系我们
        联系我们
        分享本页
        返回顶部

          XML地图