標籤:androi 關聯 動態庫 span ack 執行 color tps develop
之前都是在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方式開發