1. 程式人生 > >Android Studio 下使用第三方連結庫

Android Studio 下使用第三方連結庫

Android Studio(以下簡稱AS)引入jni開發後,可以呼叫C/C++程式碼,未開發帶來極大的便利,C/C++的編譯執行效率也要比java程式碼高,而且還可引用第三方動態庫或者靜態庫,避免了二次開發。 下面介紹如何在AS中如何實現引用第三方庫(以opus庫為例),這裡使用的是經典的Android.mk。 1. 如何將預設的CMake編譯方式調整為Android.mk,不在贅述,詳情檢視如下連結: http://blog.csdn.net/xy_kok/article/details/72876758 2. 經過修改後Android.mk中指定了jni庫的編譯規則,這裡需要做的是將其重新命名。由於個人原因同一個模組下只允許存在一個Android.mk檔案。這裡重新命名為opusjni.mk,程式碼如下:
從示例程式碼中可以看出,文中引用了一個名為static_opus的動態庫,這個稍後會依據opus庫編譯出來。 3. jni檔案所在cpp目錄下建立include和libs目錄,分別存放第三方所用的標頭檔案和庫。如下圖所示
4. 如上圖所示,在cpp目錄下新建一個opuslib.mk的檔案,主要指定第三方lib庫的編譯規則,該檔案內容如下:
從示例中不難看出,檔案以libs目錄下的libopus.so為原始檔,將其預構建成一個名為libstatic_opus.so的動態庫。 注意:文中使用libopus.so必須符合規定abi中所指定平臺架構,可以從網上找對應平臺的庫,當然為了安全最好是,下載原始碼,配置交叉編譯環境,編譯平臺所需的目標庫。
5. 在第2步中我們將Android.mk檔案重新命名了,所以要再為build.gradle配置一個新的Android.mk檔案,並將上述步驟中的opuslib.mk 和 opusjni.mk串聯起來,內容如下:
注意:最好將所有的mk檔案都放在同一級目錄下,否則在串聯mk檔案中,容易發生目錄混淆的問題。 6. Application.mk檔案內容如下:
APP_STL := stlport_static
APP_ALLOW_MISSING_DEPS=true

7. 最後如果依然無法通過編譯,則把要使用的庫都放到sdk的ndk-bundle目錄下去 ./ndk-bundle/platforms/android-24/arch-arm/usr/lib/libopus.so ./ndk-bundle/platforms/android-24/arch-arm64/usr/lib/libopus.so 這裡預設連結24版本,如果分不清的話,可以寫個指令碼或者批處理把庫複製到所有的版本下去。