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

//java类对应的包名+类名
#define className "org/qt/QtAndroidTest" void AndroidTest::test()
{
jint a = 12;
jint b = 4;
//可以直接调用java内置类中的方法
jint max = QAndroidJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b); //jclass javaMathClass = "java/lang/Math";
jdouble value = QAndroidJniObject::callStaticMethod<jdouble>("java/lang/Math", "random"); qDebug() << "111" << max << value;
} void AndroidTest::printText()
{
QAndroidJniEnvironment env;
jclass clazz = env.findClass(className);
QAndroidJniObject obj(clazz);
obj.callMethod<void>("printText");
} void AndroidTest::printMsg()
{
#if 0
//查看源码得知不传入jclass类的函数中内部会自动根据类名查找jclass
QAndroidJniEnvironment env;
jclass clazz = env.findClass(className);
QAndroidJniObject::callStaticMethod<void>(clazz, "printMsg");
#else
//没有参数和返回值可以忽略第三个参数
QAndroidJniObject::callStaticMethod<void>(className, "printMsg");
//QAndroidJniObject::callStaticMethod<void>(classNameTest, "printMsg", "()V");
#endif
} void AndroidTest::printValue(int value)
{
QAndroidJniObject::callStaticMethod<jint>(className, "printValue", "(I)I", (jint)value);
} void AndroidTest::setValue(float value1, double value2, char value3)
{
QAndroidJniObject::callStaticMethod<void>(className, "setValue", "(FDC)V", (jfloat)value1, (jdouble)value2, (jchar)value3);
} int AndroidTest::getValue(int value)
{
//java类中有两个 getValue 函数 一个需要传参数
//jint result = QAndroidJniObject::callStaticMethod<jint>(className, "getValue");
jint result = QAndroidJniObject::callStaticMethod<jint>(className, "getValue", "(I)I", (jint)value);
return result;
} void AndroidTest::setMsg(const QString &msg)
{
QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg);
QAndroidJniObject::callStaticMethod<void>(className, "setMsg", "(Ljava/lang/String;)V", jmsg.object<jstring>());
} QString AndroidTest::getMsg()
{
QAndroidJniObject result = QAndroidJniObject::callStaticObjectMethod(className, "getMsg", "()Ljava/lang/String;");
return result.toString();
} void AndroidTest::setText(int value1, float value2, bool value3, const QString &msg)
{
QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg);
QAndroidJniObject::callStaticMethod<void>(className, "setText", "(IFZLjava/lang/String;)V", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>());
} QString AndroidTest::getText(int value1, float value2, bool value3, const QString &msg)
{
QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg);
QAndroidJniObject result = QAndroidJniObject::callStaticObjectMethod(className, "getText", "(IFZLjava/lang/String;)Ljava/lang/String;", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>());
return result.toString();
}
  1. 在原生Android开发中,不同页面会定义不同的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

Qt安卓开发经验001-010的更多相关文章

  1. PE 001~010

    题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的 ...

  2. 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)

    除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...

  3. 涛哥:Qt安卓-5.12环境搭建

    简介 Qt for android 环境搭建,以Windows平台 Qt5.12为基准. 因为有不少人问相关问题,所以写篇文章汇总一下. 安装Qt 需要先安装Android版的Qt. 一般在Qt的安装 ...

  4. 【转】安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少

    本文由 ImportNew - 唐尤华 翻译自 gigavoice.如需转载本文,请先参见文章末尾处的转载要求. 除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的 ...

  5. [安卓基础] 001.学习Android开发的好教程

    如果想自学android,有许多不错的android网站.这里收集了一些,列举如下: 国内 极客学院,这里有非常丰富的视频教程. http://www.jikexueyuan.com/course/a ...

  6. QT 安卓 悬浮窗权限动态申请

    一:申请方式: String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMI ...

  7. QT 安卓 调用java类

    用以下方式即可调用java类中的方法 QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject Devi ...

  8. QT 安卓动态获取权限

    一:在AndroidManifest.xml文件中赋予相关权限 二: package ckdz.Appproject; import android.Manifest; import android. ...

  9. [安卓自动化测试] 001.UIAutomator初探

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  10. 采访Philipp Crocoll:安卓平台上整合Java和C#

    在这个采访中,我们跟开源开发者Philipp Crocoll讨论了关于Keepass2Android的相关话题.Keepass2Android不仅具有强大的密码存储的功能,还是在一个单独的安卓应用同时 ...

随机推荐

  1. .NET高级调试 - 3.9~3.11代码审查以及杂项命令

    简介 代码审查就是观察代码,代码形态分为三种C#代码>IL代码>汇编代码.通过代码审查,可以从原始代码的字节流中推测出逻辑详情 高级调试本质上属于逆向分析,更多的是以汇编为主. 反汇编代码 ...

  2. day14-Scanner

    Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.Java.util.Scanner是Java5的新特征,我们可以 ...

  3. 自学PHP笔记(二)PHP数据类型

    PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 boolean 布尔值 integer 整型 float 浮点型 array 数组 object 对象 resource 资源 N ...

  4. vue项目整合echarts

    准备工作: 首先我们初始化一个vue项目,执行vue init webpack echart,接着我们进入初始化的项目下.安装echarts, npm install echarts -S //或   ...

  5. SpringBoot之后端图形验证码实现

    此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就可以用. 1.验证码类 package com.youyou.login.util.validatecode; import lomb ...

  6. Scala代码练习

    1.编程实现百分制转换成五级制,规则如下: 90~100分,返回优秀: 80~89分,返回良好: 70~79分,返回中等: 60~69分,返回及格: 60分以下,返回不及格. object grade ...

  7. 阿里云免费SSL证书申请全过程(图文详解)

    下面我们来详细说下阿里云的域名是如何注册购买,解析绑定的. 首先,打开阿里云官网 ​万网早就被阿里云收购了,所以是同一家.输入你想购买的域名,我这里是随便输入了"aliyun.com&quo ...

  8. ClickHouse-查询优化

    单表查询[使用的频率高] 1.prewhere代表where Prewhere 和 where 语句的作用相同,用来过滤数据.不同之处在于 prewhere 只支持*MergeTree 族系列引擎的表 ...

  9. Sqlsugar调用Oracle的存储过程

    前段时间在搬迁项目的时候,遇到一个问题,就是用sqlsugar调用oracle的存储过程的时候调用不了: 当时卡了一整天,现在有空了把这个问题记录分享一下. 先去nuget上安装一下sqlsugar的 ...

  10. getExplorerInfo:获取浏览器信息

    function getExplorerInfo() { let t = navigator.userAgent.toLowerCase(); return 0 <= t.indexOf(&qu ...