1.引言
關于ndk的概念小知識點的總結ndk官網概念
2.正題
定義:
Native Development Kit(ndk)原生開發包:android是運行在dvm上的程序,而ndk可以使C/C++ ,執行應用中的部分代碼
Ndk包括以下內容:
1.ndk構建的腳本文件
2.支持所有未來Android平臺的一系列原生系統頭文件和庫
3.將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
為什么要用ndk?
- 代碼的保護,由于apk的java層代碼很容易被反編譯,而C/C++庫被反編譯的難度較大。
- 在NDK中調用第三方C/C++庫,往往這些第三方庫是java層做不到的。
- 便于移植,用C/C++寫的庫可以方便在其他的嵌入式平臺上再次使用。
android 項目中的ndk 包含哪些文件:
2.1.Android.mk文件
]:文件位于項目 jni/ 目錄的子目錄中,用于向構建系統描述源文件和共享庫。
Android.mk 文件必須首先定義 LOCAL_PATH 變量:
LOCAL_PATH := $(call my-dir)
此變量表示源文件在開發樹中的位置。在這里,構建系統提供的宏函數 my-dir 將返回當前目錄(包含 Android.mk 文件本身的目錄)的路徑。(ndk-build的構建路徑)
CLEAR_VARS 變量,其值由構建系統提供。
include $(CLEAR_VARS)
CLEAR_VARS 變量指向特殊 GNU Makefile,可為您清除許多 LOCAL_XXX 變量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 請注意,它不會清除 LOCAL_PATH。此變量必須保留其值,因為系統在單一 GNU Make 執行環境(其中所有變量都是全局的)中解析所有構建控制文件。 在描述每個模塊之前,必須聲明(重新聲明)此變量。
ps:makefile文件:makefile(或Makefile)它就是一個構建的規則,描述了哪些文件需要先編譯,哪些后編譯,如何鏈接... make就是一個命令工具,它來解釋makefile中的規則,執行并生成規則中的定義。在window系統動態鏈接庫的 后綴是.dll文件;在Linux系統動態鏈接庫是.so文件。
LOCAL_MODULE 變量將存儲您要構建的模塊的名稱。請在應用中每個模塊使用一個此變量。(前面知道了路徑,現在又知道了文件夾名)
LOCAL_MODULE := hello-jni
枚舉源文件以空格分隔多個文件(指定要構建的文件有哪些)
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES 變量必須包含要構建到模塊中的 C 和/或 C++ 源文件列表。
最后一行幫助系統將所有內容連接到一起:(開始構建)
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY,此變量指向的腳本用于收集您在 LOCAL_XXX
變量中提供的模塊所有相關信息,以及確定如何從列出的源文件構建目標共享庫。 請注意,使用此腳本要求您至少已為 LOCAL_MODULE
和 LOCAL_SRC_FILES
賦值(如需了解有關這些變量的詳細信息,請參閱模塊描述變量)。
2.2 Applicaiton.mk
用于描述應用需要的原生模塊。 模塊可以是靜態庫、共享庫或可執行文件。
2.3 ndk-build(ndk構建命令)
ndk-build 文件是 Android NDK r4 中引入的一個 shell 腳本。其用途是調用正確的 NDK 構建腳本。 和cmd命令行一樣,他還有許多的命令行指令ndk-build的指令
2.4 Cmake 編譯c++
以上是以前ndk的做法,在android studio 2.2+,使用CMake來 編譯C/C++,并添加進native library。Android Studio 用于構建原生庫的默認工具是 CMake。由于很多現有項目都使用構建工具包編譯其原生代碼,Android Studio 還支持 ndk-build。
Cmake默認直接將打好的.so文件 塞進了apk中。在項目的libs文件是找不到.so文件 。可以在project/app/build/intermediates/Cmake下面看到編譯之后的so文件。
下圖 是將apk解壓得到的lib文件。
2.5 lib下為什么會有不同文件的so文件。
不同 Android 手機使用不同的 CPU,因此支持不同的指令集。CPU 與指令集的每種組合都有其自己的應用二進制界面(或 ABI)。 ABI 可以非常精確地定義應用的機器代碼在運行時如何與系統交互。 您必須為應用要使用的每個 CPU 架構指定 ABI。