Qt安卓开发经验011-020
-
安卓中一个界面窗体对应一个Activity,多个界面就有多个Activity,而在Qt安卓程序中,Qt这边只有一个Activity那就是QtActivity(包名全路径 org.qtproject.qt5.android.bindings.QtActivity),这个QtActivity是固定的写好的,整个Qt程序都是在这个QtActivity界面中。你打开AndroidManifest.xml文件可以看到对应节点有个name=org.qtproject.qt5.android.bindings.QtActivity,所以如果要让Qt程序能够更方便通畅的与对应的java类进行交互(需要上下文传递Activity的,比如震动,消息提示等),建议新建一个java类,继承自QtActivity即可,这样相当于默认Qt启动的就是你java类中定义的Activity,可以很好的控制和交互。
-
由于AndroidManifest.xml文件每个程序都可能不一样,为了做成通用的组件,这就要求可能不能带上AndroidManifest.xml文件,这样的话每个Qt安卓程序都启动默认内置的Activity,如果依赖Activity上下文的执行函数需要传入Qt的Activity才行,这里切记Qt的Activity包名是 Lorg/qtproject/qt5/android/bindings/QtActivity; 之前顺手想当然的写的 Landroid/app/Activity; 发现死活不行,原来是包名错了。
-
一个Qt安卓程序中可以有多个Java类,包括继承自Activity的类(这样的Activity可以通过QtAndroid::startActivity函数来调用),但是只能有一个通过AndroidManifest.xml文件指定的Activity,不指定会默认一个。如果java类中不需要拿到Qt的Activity进行处理的,可以不需要继承任何Activity,比如全部是运算的静态函数。
-
在java类中如果上面没有主动引入包名,则下面需要写全路径,引入了则不需要全路径可以直接用(包括枚举值都可以直接写,比如 VIBRATOR_SERVICE 这种枚举值引入了包名后不需要写android.content.Context.VIBRATOR_SERVICE),建议引入包名,比如上面写了 import org.qtproject.qt5.android.bindings.QtActivity; 则下面继承类可以直接写 public class QtAndroidActivity extends QtActivity,如果没有引入则需要写成 public class QtAndroidActivity extends org.qtproject.qt5.android.bindings.QtActivity 。
-
建议搭配 android studio 工具开发,因为在 android studio 中写代码都有自动语法提示,包名会提示自动引入,可以查看有那些函数方法等,还可以校验代码是否正确,而如果在QtCreator中手写有时候可能会写错,尤其是某个字母写错,当然这种错误是编译通不过的,会提示错误在哪行。
-
用Qt做安卓开发最大难点两个,第一个就是传参数这些奇奇怪怪的字符(Ljava/lang/String;)啥意思,如何对应,这也不是Qt故意为难初学者啥的,因为这套定义机制是安卓系统底层要求的,系统层面定义的一套规范,其实这个在帮助文档中写的很清楚,都有数据类型对照表,用熟悉了几次就很简单了。第二个难点就是用java写对应的类,如果是会安卓开发的人来说那不要太简单,尤其是搜索那么方便一大堆,没有搞过安卓开发的人来说就需要学习下,这个没有捷径,只是希望Qt能够尽可能最大化的封装一些可以直接使用的类,比如后期版本就提供了权限申请的类 QtAndroid::requestPermissionsSync 之类的,用起来就非常的爽,不用自己写个java类调来调去的。
-
理论上来说按照Qt提供的万能大法类QAndroidJniObject,可以不用写java类也能执行各种处理,拿到安卓库中的属性和执行方法,就是写起来太绕太费劲,在java类中一行代码,这里起码三行,所以终极大法就是熟悉安卓开发,直接封装好java类进行调用。
-
测试发现GetStringUTFChars方法对应的数据字符串中不能带有temp字样,否则解析有问题,不知什么原因。
-
数据类型参数和返回值类型必须完全一致,否则执行会提示找不到对应的函数,有返回值一定要写上返回值。
-
jar文件对包名的命名没有要求,只要放在android/libs目录下即可,安卓底层是通过包名去查找,而不是通过文件名,你甚至可以将原来的包名重新改成也可以正常使用,比如classes.jar改成test.jar也能正常使用。
安卓综合应用示例 https://qtchina.blog.csdn.net/article/details/123940153