1. 首页
  2. 生活常识

如何把qt导出形成apk(qt发布程序打包成安装程序exe工具)

    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

联系我们

000-000-0000

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息