android studio ndk-builld方式開發
阿新 • • 發佈:2017-08-08
項目 har 自己 eve mono 搜索路徑 平臺 bsp ide 之前都是在Ubuntu開發,項目也是老的,自然也就順理成章的用eclipse做各種android的開發。最近想在android studio 切換下,有點不習慣。android studio 為ndk開發提供了兩種不同的方式,使用cmake自動編譯腳本 和類似eclipse上的ndk-build。這兩者之間使用區別在於,如果想直接開發新的單模塊可以考慮使用cmake,ide有自帶輔助插件,讓程序員使用起來更加舒心。如果想在第三方源碼庫上面做二次開發,或者需要多個源碼庫關聯,感覺還是使用ndk-build會更加靈活,或者說老經驗不用重新踩那麽多坑。
關於環境搭建的可以參考android 開發者文檔,裏面有詳細的說明
https://developer.android.google.cn/studio/projects/add-native-code.html#link-gradle
下面就在android studio建一個ndk的sample項目。
1、新建一個一般項目,添加jni文件夾以及子目錄include 存放頭文件,src存放源碼
2、在java代碼中,新建 TestJni類調用native方法,並使用javah命令生成頭文件
3創建相應的方法文件
回到main目錄下
? classpath:類搜索路徑,這裏表示從當前的 bin 目錄下查找
? d:將生成的頭文件放到當前的 jni 目錄下
? o: 指定生成的頭文件名稱,默認以類全路徑名生成(包名+類名.h)
註意: -d 和-o 只能使用其中一個參數。
刷新下android studio的項目目錄就可以看到
上面javah的指令,為了後面方便使用,可以在external tools中自定義。File->Setting->Tools ->External Tools 點擊添加
這樣就可以在需要包含native方法的的文件中右鍵使用
4 cmake方法會根據腳本提供自動生成的Android.mk腳本,不過ndk-build 方法就需要自己編寫編譯配置腳本Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include \
$(LOCAL_PATH)/src
LOCAL_SRC_FILES := src/hello-jni.c
LOCAL_MODULE := NativeLib
include $(BUILD_SHARED_LIBRARY)
Android.mk文檔必須以LOCAL_PATH變量的定義開頭。
LOCAL_PATH := $(call my-dir)
Android 構建系統利用LOCAL_PATH來定位源文件。因為將該變量設置為硬編碼值並不合適,所以Android構建系統提供了一個名為 my-dir 的宏功能。通過將該變量設置為my-dir宏功能的返回值,可以將其放在當前目錄下。
Android 構建系統將CLEAR_VARS變量設置為clear_vars.mk片段的位置。包含Makefile片段可以清除除了LOCAL_PATH 以外的LOCAL_<name>變量,例如LOCAL_SRC_FILES,LOCAL_MODULE 等。
include $(CLEAR_VARS)
這樣做是因為 Android構建系統在單次執行中解析多個構建文件和模塊定義,而LOCAL_<name>是全局變量。清楚他們可以避免沖突,每一個原生組件被稱為一個模塊。
LOCAL_MODULE 變量用來給這些模塊設定一個唯一的名稱。下面的代碼將該模塊的名稱設為NativeLib。
LOCAL_MODULE := NativeLib
其實
LOCAL_MODULE := libNativeLib
結果也是可以的,編譯的生成結果,構建系統會自動添加適當的前綴後綴生成動態共享文件 ,如果前面已經添加lib,那麽還會是原樣,如:libNativeLib.so。可以在路徑 "項目路徑\unit2\app\build\intermediates\ndkBuild\debug\obj\local\架構類型\"看到。
用LOCAL_C_INCLUDES 指定頭文件的搜索路徑,LOCAL_SRC_FILES指定源文件列表,多個文件可以使用空格分開的多個源文件名字。
到這裏,就簡單描述了一個原生項目。編譯和生成實際模塊的構建系統還需要包含合適的構建系統片段,具體取決於想要生成的模塊的類型。
include $(BUILD_SHARED_LIBRARY)
其中BUILD_SHARED_LIBRARY是一個指向生成共享文件的腳本。
有下面三種文件生成格式
BUILD_STATIC_LIBRARY:編譯為靜態庫。
BUILD_SHARED_LIBRARY :編譯為動態庫 BUILD_EXECUTABLE:編譯為Native C可執行程序 這裏就不展開了
在android studio編譯原生項目,還需要配置module(app)目錄下的build.gradle。下面是需要添加的內容
android {
defaultConfig {
ndk{
abiFilters "armeabi","armeabi-v7a","x86"
}
}
externalNativeBuild{
ndkBuild{
path "src/main/jni/Android.mk"
}
}
}
apk在不同硬件平臺運行時,要根據cpu架構調用不同的共享文件。
ndk{
abiFilters "armeabi","armeabi-v7a","x86"
}
就會生成三種適合不同cpu架構的共享文件,
不配置的話,系統將會默認生成支持的所有架包,如果ndk配置發生改變,要clean project
externalNativeBuild{
ndkBuild{
path "src/main/jni/Android.mk"
}
}
選擇cmake還是ndk-build都需要在這裏面寫明腳本路徑
接下來就跑跑項目看效果。
BUILD_SHARED_LIBRARY :編譯為動態庫 BUILD_EXECUTABLE:編譯為Native C可執行程序 這裏就不展開了
android studio ndk-builld方式開發