Android 開發 NDK從入門到精通
https://blog.csdn.net/shulianghan/article/details/18964835
NDK詳解
1. 交叉編譯庫文件
C代碼執行 : C代碼被編譯成庫文件之後, 才能執行, 庫文件分為動態庫 和靜態庫 兩種;
-- 動態庫 : unix環境下.so 後綴的是動態庫, windows環境下.dll 後綴的是動態庫; 動態庫可以依賴靜態庫加載一些可執行的C代碼;
-- 靜態庫 :.a 後綴是靜態庫的擴展名;
庫文件來源 : C代碼 進行 編譯 鏈接操作之後, 才會生成庫文件, 不同類型的CPU 操作係統 生成的庫文件是不一樣;
-- CPU分類 : arm結構, 嵌入式設備處理器; x86結構, pc 服務器處理器; 不同的CPU指令集不同;
-- 交叉編譯 :windows x86編譯出來的庫文件可以在arm平台運行的代碼;
-- 交叉編譯工具鏈 : Google提供的 NDK 就是交叉編譯工具鏈, 可以在linux環境下編譯出在arn平台下執行的二進製庫文件;
NDK作用 : 是Google提供了交叉編譯工具鏈, 能夠在linux平台編譯出在arm平台下執行的二進製庫文件;
NDK版本介紹 : android-ndk-windows 是在windows係統中的cygwin使用的, android-ndk-linux 是在linux下使用的;
2. 部署NDK開發環境
(1) 下載Cygwin安裝器
下載地址 : https://cygwin.com/setup-x86.exe , 這是下載器, 可以使用該下載器在線安裝, 也可以將cygwin下載到本地之後, 在進行安裝;
安裝器使用 : Cygwin的下載, 在線安裝, 卸載 等操作都有由該安裝器進行;
-- 本地文件安裝 : 選擇安裝文件所在的目錄, 然後選擇所要安裝的安裝包;
-- 在線安裝 : 選擇在線安裝即可, 然後選擇需要的安裝包;
-- 卸載 : windows上使用其它軟件例如360, 控製麵板中是無法卸載Cygwin的, 隻能通過安裝器來卸載;
(2) 安裝Cygin
雙擊安裝器 setup-x86.exe 下一步 :
選擇安裝方式 :
-- 在線安裝 : 直接下載, 然後安裝;
-- 下載安裝文件 : 將安裝文件下載下來, 可以隨時安裝, 注意安裝文件也需要安裝器來進行安裝;
-- 從本地文件安裝 : 即使用下載的安裝文件進行安裝;
選擇Cygwin安裝位置 :
選擇下載好安裝文件位置 : 之前我下了一個完全版的Cygwin, 包括了所有的Cygwin組件, 全部加起來有5.23G, 下載速度很快, 使用網易的鏡像, 基本可以全速下載;
選擇需要安裝Cygwin組件 : 這裏我們隻需要以下組件 : binutils , gcc , gcc-mingw , gdb , make , 不用下全部的組件;
之後點擊下一步等待完成安裝即可;
.
安裝完之後, 打開bash命令窗口, 可以設置下顯示的字體, 使用 make -version 查看是否安裝成功 :
(3) Cygwin目錄介紹
以下是Cygwin安裝目錄的情況 : 該安裝目錄就是所模擬的linux 的根目錄;
對應的linux目錄 : 這兩個目錄進行對比發現, 兩個目錄是一樣的, Cygwin的安裝目錄就是 linux根目錄;
cygdrive目錄 : 該目錄是Cygwin模擬出來的windows目錄結構, 進入該目錄後, 會發現windows的盤符目錄, 通過該目錄可以訪問windows中的文件;
(4) 下載NDK工具
從Google的Android開發者官網上下載該工具, 注意NDK工具分類 : 下載地址 -https://developer.android.com/tools/sdk/ndk/index.html -;
-- windows版本NDK:android-ndk-r9c-windows-x86.zip (32位),android-ndk-r9c-windows-x86_64.zip (64位) 該版本是用在windows上的Cygwin下, 不能直接在windows上直接運行;
-- linux版本NDK :android-ndk-r9c-linux-x86.tar.bz2(32位) , android-ndk-r9c-linux-x86_64.tar.bz2 (64位) , 該版本直接在linux下執行即可;
在這裏下載windows版本的NDK, 運行在Cygwin上;
(4) NDK環境介紹
NDK工具的文件結構 :
ndk-build腳本 : NDK build 腳本是 gun-make 的簡單封裝, gun-make 是編譯C語言代碼的工具, 該腳本執行的前提是linux環境下必須安裝 make 程序;
NDK安裝在Cygwin中 : 將NDK壓縮文件拷貝到Cygwin的根目錄中, 解壓 : android-ndk-r9c 目錄就是NDK目錄;
執行以下NDK目錄下的 ndk-build 命令 : ./ndk-build ;
執行結果 :
- <span >Android NDK: Could not find application project directory !
- Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
- /android-ndk-r9c/build/core/build-local.mk:148: *** Android NDK: Aborting 。 停止。</span>

三. 開發第一個NDK程序
1. 開發NDK程序流程
a. 創建Android工程:
首選創建一個Android工程, 在這個工程中進行JNI開發;
b. 聲明native方法 :
注意方法名使用 native 修飾, 沒有方法體 和 參數, eg : public native String helloFromJNI();
c. 創建C文件 :
在工程根目錄下創建 jni 目錄, 然後創建一個c語言源文件, 在文件中引入 include <jni.h> , C語言方法聲明格式 jstring Java_shuliang.han.ndkhelloworld_MainActivity_helloFromJNI(JNIEnv *env) , jstring 是 Java語言中的String類型, 方法名格式為 : Java_完整包名類名_方法名();
-- JNIEnv參數 : 代表的是Java環境, 通過這個環境可以調用Java裏麵的方法;
-- jobject參數 : 調用C語言方法的對象, thiz對象表示當前的對象, 即調用JNI方法所在的類;
d. 編寫Android.mk文件 :
如何寫 查看文檔, NDK根目錄下有一個 documentation.html 文檔, 點擊該html文件就可以查看文檔, 查看 Android.mk File 文檔, 下麵是該文檔給出的 Android.mk示例 :
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := hello-jni
- LOCAL_SRC_FILES := hello-jni.c
- include $(BUILD_SHARED_LIBRARY)
-- include $(CLEAR_VARS) : 編譯工具函數, 通過該函數可以進行一些初始化操作;
-- LOCAL_MODULE : 編譯後的 .so 後綴文件叫什麼名字;
-- LOCAL_SRC_FILES: 指定編譯的源文件名稱;
-- include $(BUILD_SHARED_LIBRARY) : 告訴編譯器需要生成動態庫;
e. NDK編譯生成動態庫 :
進入 cygdrive 找到windows目錄下對應的文件, 編譯完成之後, 會自動生成so文件並放在libs目錄下, 之後就可以在Java中調用C語言方法了;
f. Java中加載動態庫 :
在Java類中的靜態代碼塊中使用System.LoadLibrary()方法加載編譯好的 .so 動態庫;
NDK平台版本 : NDK腳本隨著 android-sdk 版本不同, 執行的腳本也是不同的, 不同平台會引用不同的頭文件, 編譯的時候一定注意 sdk 與 ndk 版本要一致;
so文件在內存中位置 : apk文件安裝到手機上之後, .so動態庫文件存在在 data/安裝目錄/libs 目錄下;
最後更新:2017-04-03 12:55:01
上一篇:
設計模式之麵向對象基礎
下一篇:
【Android病毒分析報告】- 手機支付毒王“銀行悍匪”的前世今生
android gps wifi 基站 定位集合
如何將 Linux 命令的輸出賦值給變量
Shell腳本編程學習入門 01
從零開始學習OpenCL開發(二)一個最簡單的示例與簡單性能分析
常用u-boot命令詳解(全)
CSS3D效果
網絡子係統53_ip協議分片重組_內存閾值
PostgreSQL裏的17種文本相似算法與GIN索引 - pg_similarity
撿到iPhone7怎麼解鎖?iphone6s忘記解鎖密碼怎麼辦
error C2146: syntax error : missing ';' before identifier 'PVOID64'