Monday, November 21, 2016

Add C and C++ Code to Your Android Project

使用Android Studio 2.2或更高的版本,可以將C和C++代碼編譯成native library(即 .so文件),然後打包到APK中。Java代碼可以透過Java Native interface (JNI)調用native library中的方法。

Andorid Studio默認使用CMake編譯原生庫,由於已經有大量的代碼使用了ndk-build來編譯
native code,所以Android Studio也支持ndk build。如果你想導入一個ndk-build庫到你的Android Studio項目中,請參閱後文的連結本地庫與Gradle。然而,如果你創建了一個新的native code工程,你應該使用CMake。

本篇文章將會說明如何使用Android Studio 來創建、配置Android 項目,以支持native code,以及將其運行到你的app 中。

下載NDK和建構工具

  • Android原生開發套件(NDK):允許使用C和C++與Android的代碼,並提供平台庫。
  • CMake:外部構建工具。如果你只打算使用NDK的構建你不需要這個組件。
  • LLDB:Android Studio用於調試本機代碼。
安裝步驟:
  1. 從菜單欄中選擇 SDK Manager 
  2. 點擊SDK Tools選項卡
  3. 勾選LLDB,CMake和NDK
  1. 點擊Apply,然後點擊OK。
  2. 當安裝完成後,點擊Finish,然後點擊OK。

建立支持C/C++的Project

建立一個支持native code 的專案和創建普通的Android studio 工程很像。但是有幾點需要留意的地方:

在Configure your new project選項中,勾選Include C++ Support選項。點擊Next,後面的流程和創建普通的Android studio 工程一樣。在Customize C++ Support選項卡中。


你有下面幾種方式來自定義你的項目:
  1. C++ Standard:點擊下拉框,可以選擇標準C++,或者選擇默認CMake設置的Toolchain Default選項。
  2. Exceptions Support:如果你想使用有關C++異常處理的支持,就勾選它。勾選之後,Android Studio會在module層的build.gradle文件中的cppFlags中添加-fexcetions標誌。
  3. Runtime Type Information Support:如果你想支持RTTI,那麼就勾選它。勾選之後,Android Studio會在module層的build.gradle文件中的cppFlags中添加-frtti標誌。
  4. 點擊“Finish”。
當Android Studio完成新項目創建後,打開Project面板,選擇Android視圖。Android Studio會添加cpp和External Build Files目錄。

1.cpp目錄存放你所有native code的地方,包括源碼,頭文件,預編譯項目等。對於新項目,Android Studio創建了一個C++模板文件:native-lib.cpp,並且將該文件放到了你的app模塊的src/main/cpp/目錄下。這份模板代碼提供了一個簡答的C++函數:stringFromJNI(),該函數返回一個字符串:”Hello from C++”。

2.External Build Files目錄是存放CMake或ndk-build構建腳本的地方。有點類似於build.gradle文件告訴Gradle如何編譯你的APP一樣,CMake和ndk-build也需要一個腳本來告知如何編譯你的native library。對於一個新的項目,Android Studio創建了一個CMake腳本:CMakeLists.txt,並且將其放到了你的module的根目錄下。

運行APP

當你點擊Run按鈕,Android Studio會編譯並啟動一個APP ,然後在APP中顯示一段文字”Hello from C++”。從編譯到運行示例APP的流程簡單如下:

1.Gradle調用外部構建腳本,也就是CMakeLists.txt。

2.CMake會根據構建腳本的指令去編譯一個C++源文件,也就是native-lib.cpp,並將編譯後的產物扔進共享對像庫中,並將其命名為libnative-lib.so,然後Gradle將其打包到APK中。

3.在運行期間,APP的MainActivity會調用System.loadLibrary()方法,加載native library。而這個庫的原生函數,stringFromJNI(),就可以為APP所用了。

4.MainActivity.onCreate()方法會調用stringFromJNI(),然後返回“Hello from C++”,並更新TextView的顯示。

如果你想驗證一下Gradle 是否將native library 打包進了APK,你可以使用APK Analyzer:
  1. 選擇Build > Analyze APK
  2. 從app/build/outputs/apk/路徑中選擇APK,並點擊OK
  3. 如下圖,在APK Analyzer窗口中,選擇lib/<ABI>/,你就可以看見libnative-lib.so



Reference:
https://wl9739.github.io/2016/09/21/%E5%9C%A8-Android-Studio-2-2-%E4%B8%AD%E6%84%89%E5%BF%AB%E5%9C%B0%E4%BD%BF%E7%94%A8-C-C-md/
https://developer.android.com/studio/projects/add-native-code.html#download-ndk
https://developer.android.com/studio/projects/create-project.html

No comments:

Post a Comment