在我寫這篇文章的時候,Android Studio已經是2.3版本了,已經集成CMake 編譯工具,
用戶只需在 新建項目的時候,添加選項(Include C++ support),Android Studio就會自動
幫你部署好相應的NDK環境。但我還是想嘗試使用 Android.mk 配置文件方式來實現NDK開發,
了解其配置的原理,然后再使用 CMake 來部署,這樣能了解兩者間的區別。后續的文章就會寫
到用CMake來部署NDK環境。
假設你已經安裝好了 Android Studio 與NDK 環境。
建議將ndk-build所在目錄加入PATH環境變量,以便后續調試。
1、打開 File => Project Structure 如下:
如果選框中為空,說明你沒有配置好NDK環境。
2、copy 路徑, 然后打開如下 windows 系統下的環境變量
在 Path 變量里添加你的 NDK路徑,即上一步copy的內容,記住在路徑前添加 ; 分號。
確定之后,就在Windows 命令窗口 輸入 ndk-build,得到如下圖,說明你配置成功了。
下面我們來新建一個Android項目,實現一個簡單的NDK方法。
1、創建一個NDKUtils.Java類, 新建一個 native 方法,
public native String invokeCmethod();
然后在該類 添加如下代碼,即載入庫的含義:
static {
System.loadLibrary("NDKUtils");//導入生成的鏈接庫文件
}
2、點擊 菜單 Build =>Make Project,就會編譯項目,然后在
你的項目跟路徑 app\build\intermediates\classes\debug\com\magicing\eigenndk
可以看到 NDKUtils.class 文件(com\magicing\eigenndk 是包名,對應你自己的包名)
3、進入Android Studio命令行頁面:
如果你沒有這個選項,則你從 View菜單欄里 Tool Windows => Terminal 調出該頁面。
輸入如下命令:
cd app/src/main // 進入該路徑
然后執行下面編譯命令
javah -d jni -classpath F:\AndroidSDK\platforms\android- 23\android.jar;..\..\build\intermediates\classes\debug com.magicing.ndktest2.NDKUtils
解釋(根據自身的情況來設置):
F:\AndroidSDK\platforms\android-23\android.jar; //是你的SDK路徑,
..\..\build\intermediates\classes\debug //相對路徑,都一樣
com.magicing.ndktest2.NDKUtils // NDKUtils 的命名空間
4、當上述的命令執行成功后,在app/src/main 多了一個 jni 文件夾,里面有一個
com_magicing_eigenndk_NDKUtils.h 文件。在該路徑下copy 一個相同名,后綴
為 .c 的文件 com_magicing_eigenndk_NDKUtils.c 。然后該文件就是C 語言的實現文件。
把如下方法調整一下(完善參數命名,且添加一個大括號),得到如下:
/*
* Class: com_magicing_eigenndk_NDKUtils
* Method: invokeCmethod
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_magicing_eigenndk_NDKUtils_invokeCmethod
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"NDK 獲取Native 字符串");
}
5、在jni 目錄下創建 Android.mk 配置文件,內容如下:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKUtils
LOCAL_SRC_FILES := com_magicing_eigenndk_NDKUtils.c
include $(BUILD_SHARED_LIBRARY)
Android.mk 官網介紹
https://developer.android.com/ndk/guides/android_mk.html
6、在jni 目錄下創建 Application.mk 配置文件,內容如下:
APP_PLATFORM := android-23
APP_ABI := armeabi
Application.mk 官網介紹
https://developer.android.com/ndk/guides/application_mk.html
7、然后繼續在命令行端口執行 ndk-build 命令,得到如下:
該命令是編譯C文件,然后生成 .so 文件,生成在 app\src\main\libs 目錄下。
ndk-build 還有很多參數,大家可以去查詢一下其它資料,如果有時間,我后續篇幅詳細講一下。
8、配置根目錄下的 build.gradle 文件
主要添加如下代碼:
sourceSets{
main{
jni.srcDirs = [] // disable automatic ndk-build call, which ignore our Android.mk
jniLibs.srcDir 'src/main/libs'
}
}
這樣, native invokeCmethod 方法算是銜接好了,只有在MainActivity 上實例化這個類,然后
調用 這個方法,就能輸出相應的字符串,這樣就簡單的實現NDK功能。
