
之前Qt的人臉特效方面的c++專案,用到的庫很多,FFmpeg OpenGL OpenCV libYUV GLM...
最近決定同樣的東西,在安卓上做完整做一次,
雖然大部分都是標準c/c++但移植程序,也出現了很多小問題,麻煩,
這些小問題,麻煩雖然都能拐個彎解決,但總結其實就是,安卓開發其實要比Qt,iOS麻煩一些,
很多東西并不能一步到位,尤其一些c c++專案,并不像ios qt那樣,基本不怎么改就能直接跑起來,安卓上光c++庫就好幾個,libc++ gunc++,, 而且版本不兼容, 一些早年開發的opencv的專案什么的,很可能導致很多麻煩,
1 OpenGL方面,GLSL放在asset下. JNI傳入AssetManager 來獲取,讀取shader檔案. 這個做法點贊,類似Qt,因為把shader當字串,寫在代碼里,每行敲一個"\n",實在太糟糕了,弄在Asset里面還有個好處,當然Qt做得更好一些,把shader檔案打包到可執行檔案二進制里面了,更隱蔽,之前可以看到很多商業公司的軟體,shader檔案竟然暴露在外面,
2 安卓OpenGLES直接上3.0, 3.0的GL,有VAO,GLSL 支持layout, in out關鍵字,用起來更舒服,更合理.
3 寫FFmpeg,99%都一樣,這個不必說,libYUV可以替代swscale,谷歌自家寫的,效率應該有優化.
4 OpenCV,這個確實有很多麻煩,首先是c++ 有幾個版本,有些不兼容,libc++ gunc++ libstdc++ 這背后就不細說,GCC/LLVM/Clang.. OpenCV3.x用的是gnuc++, 如果你用的是ndk r16之前的ndk,就用gnuc++, r16之后,用的是libc++,用錯了opencv都編不過,
5 如果你的代碼是早年的opencv寫的專案,可能還比較麻煩,如果用最新的安卓studio,最新的ndk,就只能改,將代碼改成opencv4.x最新的兼容版本.
6 訓練的model ,classifier,在安卓上加載,還不能用assertmanager,assermanager其實蠻方便的,比如加載圖片,GLSL, 這些二進制檔案,建議用java讀取asset/Resources檔案,然后拷貝到App私有目錄下,然后再按照之前iostream方式加載,
成功移植到安卓的結果:

以上就是安卓在FFmpeg,OpenGL,OpenCV開發程序中的小麻煩總結,跑通了其實也比較簡單,就那么點事兒.但整個程序,沒有iOS/Qt那樣單純,簡單,直觀,總要拐個彎去解決,畢竟有個java擺在那. 其實從Qt框架移植到安卓上,就可以看到,很多地方,在c++層也呼叫了java API來解決問題,如果c++實在解決不了的話,
深入做客戶端開發,一些核心代碼,第三方庫還得靠c++,所以客戶端開發程式員,熟練掌握一個c++開發工具是非常有必要的,推薦Qt, 或者VC++,或者VSCode+CMake. 三者都行, Qt為什么首推薦,因為開源,當你有時候遇到一個小問題,而沒頭緒的時候,你可以去看看Qt原始碼里面怎么解決的,尤其是你周圍沒有什么人跟你討論的時候,一些好的開源專案,比如Qt,WebRTC,都可能找到很好的思路,將好的理念借鑒.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/301550.html
標籤:其他
上一篇:RxSwift 回應式編程
