android qt 对比_Qt android浅析

Qt5支持编写Android应用。

典型main:

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

w.show();

return a.exec();

}

这会在Android设备上显示一个空白窗口。

但是:问题1, main函数“冲突”。我们知道Android进程源于zygote的fork,作为进程入口的函数main早就执行过了,那么上述代码这中Qt的入口函数main又何时怎么被执行的呢?

问题2,Android activity的生命周期是如何转化为qt的生命周期的?

问题3,qt主线程和Android主线程的关系是什么样的?

helloworld工程分析

在qtcreator新建一个helloworld的工程,编译后,在qt的build目录下,可以看到目录结构:

- android_build/

- libhelloworld.so

- main.o

- mainwindow.o

.o文件显然对应各个cpp文件,so文件是.o文件的“集合”。android-build的目录经过简单的查看,可以知道是一个gradle组织的android工程。

所以qt的Android支持,简单看就是将我们写的qt代码生成so文件,并通过自动生成的Android模板工程来最终生成一个apk文件。

看下android_build中的build.gradle:

……

sourceSets {

main {

manifest.srcFile 'AndroidManifest.xml'

java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']

aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']

res.srcDirs = [qt5AndroidDir + '/res', 'res']

resources.srcDirs = ['src']

renderscript.srcDirs = ['src']

assets.srcDirs = ['assets']

jniLibs.srcDirs = ['libs']

}

}

……

build.gradle中通过sourceSets调整了com.android.application插件的默认源码、资源路径。

主要引入了qt5AndroidDir目录下的src、aidl和res。

qt5AndroidDir定义在gradle.properties:

qt5AndroidDir=/Users/xxxx/Qt5.10.1/5.10.1/android_armv7/src/android/java

一般指向qt安装目录中的android_armv7/src/android/java.

看下libs目录:

libs

├── QtAndroid-bundled.jar

└── armeabi-v7a

├── gdbserver

├── libQt5Core.so

├── libQt5Gui.so

├── libQt5Widgets.so

├── libgdbserver.so

├── libgnustl_shared.so

├── libhelloworld.so

├── libplugins_imageformats_libqgif.so

├── libplugins_imageformats_libqicns.so

├── libplugins_imageformats_libqico.so

├── libplugins_imageformats_libqjpeg.so

├── libplugins_imageformats_libqtga.so

├── libplugins_imageformats_libqtiff.so

├── libplugins_imageformats_libqwbmp.so

├── libplugins_imageformats_libqwebp.so

├── libplugins_platforms_android_libqtforandroid.so

└── libplugins_styles_libqandroidstyle.so

qt运行所需的几个核心so拷贝被拷贝到了libs目录下,这样就会被打包到最终的apk中。还引入了一个QtAndroid-bundled.jar依赖。

总结qt编写的代码会生成为一个动态库,以工程名命名

qt生成Android应用的策略是借助了一个模板工程

不难猜测,qt应用的运行模式是,通过模板工程生成的Android应用,以native调用方式执行qt代码

启动流程

上节分析可知,Android代码主导了整个进程的运行。那么寻找Qt应用入口就从Android代码入手。

Android应用入口一般是Application,模板工程android-build中,QtApplication继承了Applicaiton,但是浏览一遍并没有发现加载libhelloworld.so的地方,先略过。

Application加载后会会执行“主Activity”,也就是指定有category.LAUNCHER的那个Activity,在模板工程中是QtActivity。

这样,主Activity的onCreate就不亚于第二入口:

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

onCreateHook(savedInstanceState);

}

onCreateHook

protected void onCreateHook(Bundle savedInstanceState) {

m_loader.APPLICATION_PARAMETERS = APPLICATION_PARAMETERS;

m_loader.ENVIRONMENT_VARIABLES = ENVIRONMENT_VARIABLES;

m_loader.QT_ANDROID_THEMES = QT_ANDROID_THEMES;

m_loader.QT_ANDROID_DEFAULT_THEME = QT_ANDROID_DEFAULT_THEME;

m_loader.onCreate(savedInstanceState);

}

这里看到的m_loader是类QtActivityLoader

Loader

QtActivityLoader.create:

……

m_displayDensity = m_activity.getResources().getDisplayMetrics().densityDpi;

ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME

+ "/\tQT_ANDROID_THEME_DISP

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt for Android中连接MySQL数据库,可以通过以下步骤来实现: 1. 首先,确保你已经在Android设备上安装了MySQL数据库,并且可以通过网络访问。 2. 在Qt项目中,添加MySQL插件。在.pro文件中添加以下行: ``` QT += sql ``` 3. 在代码中,使用以下代码片段来连接MySQL数据库: ```cpp #include <QtSql> QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("your_mysql_server_host"); db.setPort(your_mysql_server_port); db.setDatabaseName("your_database_name"); db.setUserName("your_username"); db.setPassword("your_password"); if (db.open()) { // 连接成功 } else { // 连接失败 QString error = db.lastError().text(); } ``` 请将上述代码中的"your_mysql_server_host"、"your_mysql_server_port"、"your_database_name"、"your_username"和"your_password"替换为实际的MySQL服务器主机名、端口号、数据库名称、用户名和密码。 4. 通过执行SQL查询语句来与数据库进行交互。例如,可以使用以下代码来执行一个查询: ```cpp QSqlQuery query; query.exec("SELECT * FROM your_table_name"); while (query.next()) { // 处理查询结果 QString column1 = query.value(0).toString(); QString column2 = query.value(1).toString(); // ... } ``` 请将上述代码中的"your_table_name"替换为实际的表名,根据需要修改查询语句。 这样,你就可以在Qt for Android中连接MySQL数据库了。请注意,为了使连接正常工作,你的Android设备需要具有与MySQL数据库服务器的网络连接,并且需要正确配置防火墙和访问权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值