Android Studio呼叫QT for Android生成的.so庫

Android Studio呼叫QT for Android生成的.so庫

本文介紹如何實現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了!
這裡寫圖片描述