本文介绍如何实现Android 与 QT 的结合,使Android能够调用QT的代码,避免重复造轮子
最近在做AndroidStudio调用QT写的so库,在网上搜集资料,大多数都不全,而且很少有AndroidStudio版本,于是将自己这几日的心得做以研究整理:
首先,Android调用的库是.so库,所以QT必须安装QT for Android,否则无法生成对应的.so库,不要想着用linux系统也可以,因为它必须要生成具体的CPU架构的.so库。具体的QT for Android环境配置,这里就不介绍的,可以自行百度,网上资料很多,主要说一下,因为可能有的人需要在AndroidStudio里编写.so库,来间接调用第三方库,中间会用到ndk-build命令,我几乎每个版本ndk都试了一遍,推荐使用r10e版本。
好,话不多说,步入正题:
1.QT生成so文件:
如果已将QT for Android环境配置好,那么在新建QT项目时,右上角应该会有Android的选项
如图,我们选择新建Library->C++库,选择Android设备模板
选择共享库然后下一步
这个根据SDK配置的版本,可能会有多个CPU架构Android设备选项,自己根据需求选择,然后下一步
这里也是根据需要勾选,但是目前本人发现Android Studio下不支持QT UI,这里需要注意的是QtCore默认是勾选的,不要去掉,一定不能去掉,因为去掉后,构建项目时会提示缺少文件,然后一直下一步,直到点击完成然后就是编写自己需要调用的C++源码,中间通过JNI方式间接调用,这里主要说一下,在JNI实现C文件时,一定要注册本地方法
这是我在AndroidStudio中写的本地方法,因此在JNI中,一定要有对应的实现,如下:
这是QT中JNI代码中对本地方法的注册,注意,一定要对应,具体中间格式问题,请自行查找资料。所有代码写完后,Ctrl+B或者点构建,构建项目,就会在对应的debug目录下生成.so文件,注意:
这里选的哪个型号CPU架构的,就会生成对应的.so,然后在AndroidStudio中调用时,要放到对应文件夹下,还要运行对应的虚拟机,本人这里是armeabi-v7a架构的。到这里,QT的事情就做完了,接下来是AndroidStudio了,生成对应工程文件后,将.so拷到\src\main\jniLibs\目录下,一定要是这里,因为系统默认寻找.so文件就是在这个目录下,不要放在别的地方,网上有的教程说放在别的地方,然后在配置里边指定目录,这有可能会导致程序编译出错,还有注意,如果有人用到dlopen()函数,它的寻找目录也是这里。注意,一定要放在对应CPU架构下,因为我QT选的是armeabi-v7a架构,于是我就在armeabi-v7a目录下,没有就自己建一个文件夹
然后就是调用了,具体代码自己查找资料编写,在打代码完成后,运行APP,会发现APP直接崩溃,甚至有的无法编译通过,打开LOG日志,会发现提示,dlopen……*.so失败,缺少libQt5Core.so文件,这个你可以在电脑中查找,会发现它在QT安装目录下,QT\5.8,进入到5.85目录
然后到你对应的CPU架构目录下lib目录里,你可以自己直接右上角查找,找到,拷到AndroidStudio的JniLibs目录下,和你的so文件放在一起,然后编译运行,发现有提示,缺少libgnustl_shared.so文件,这个文件实在ndk安装目录里边,我的是在E:\Android\android-ndk-r10e\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a内,记住,一定要拷对应CPU型号的文件,要不然,还会出错,当这两个文件都有了,应该就OK了!