1. 程式人生 > >android studio ndk-builld方式開發

android studio ndk-builld方式開發

項目 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都需要在這裏面寫明腳本路徑 接下來就跑跑項目看效果。

android studio ndk-builld方式開發