android studio ndk-builld方式開發

來源:互聯網
上載者:User

標籤: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方式開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.