鍍金池/ 教程/ Android/ 概述
                                          安裝 NDK
                                          application.mk
                                          調試
                                          Android.mk 文件
                                          Hello JNI 示例
                                          概述
                                          Box2D 的 Android NDK 實現
                                          TwoLibs 示例

                                          概述

                                          注意:在 Windows 上運行 NDK 需要有 Cygwin 支持,個人建議使用 Ubuntu 為好 。

                                          介紹:

                                          Android SDK 是一個允許 Android 應用開發人員使用 C 或 C++源文件編譯并嵌入到本機源代碼中的應用程序包的一組工 具。

                                          重要說明:

                                          Android NDK 只能用于 android 1.5 以上版本

                                          1. Android NDK 的目的:

                                          Android 虛擬機允許你的應用程序源代碼通過 JNI 調用在本地實現的源代碼,簡單的說,這就意味著:

                                          —-你的應用程序將聲明一個或多個用’native’關鍵字的方法用來指明它們是通過本地代碼實現的 例如:

                                              native byte[] loadFile(String filePath)

                                          —-你必須提供包含實現這些方法的共享庫(就是.so),將共享庫打包到你的應用程序包 apk 中,這些庫文件必須根據 標準的 Unix 約定來命名為 lib.so,并且是需要包含一個標準的 JNI 的接口,例如

                                               libFileLoader.so

                                          —-你的應用程序必須明確的裝載這些庫文件(.so文件),比如,在程序的開始裝載它,只需要簡單的添加幾句源代碼:

                                              static {
                                          
                                              System.loadLibrary(“FileLoader”);
                                          
                                              }

                                          注意:這里你不必再將前綴 lib 和后綴.so 寫入。

                                          Android NDK 對于 Android SDK 只是個組件,它可以幫你:

                                          —-生成的 JNI 兼容的共享庫可以在大于 Android1.5 平臺的 ARM CPU 上運行

                                          —-將生成的共享庫拷貝到合適的程序工程路徑的位置上,以保證它們自動的添加到你的 apk 包中(并且簽名的)

                                          —-在以后的版本中,我們將提供來幫助你的源代碼通過遠程 gdb 連接和盡可能多的源代碼的信息。

                                          而且,Android NDK 還提供:

                                          —-一組交叉編譯鏈(編譯器、鏈接器等)來生成可以在 Linux,OS X 和 Windows (用 Cygwin )運行的二進制文件

                                          —-一組與由 Android 平臺提供的穩定的本地 API 列表的頭文件

                                          它們在 docs/STABLE-APIS.html 中有說明

                                          重要提示:

                                          記住,在以后的更新和發布平臺中,Android 系統鏡像中的大多數本地系統庫并不是一成不變的,而是可以徹底改變, 甚至刪除的

                                          —-一個編譯系統(build system)可以允許開發者寫一個非常短的編譯文件(build files)去描述哪個源代碼需要編譯,并且怎樣編譯。編譯系統可以解決所有的 toolchain/platform/CPU/ABI 細節的問題。并且,較晚的 NDK 版 本中還添加了更多的可以不用改變開發者的編譯文件的情況下的 toolchains,platforms,系統接口

                                          2. Android NDK 的缺點

                                          NDK 并不是一個可以編寫通用的源代碼并且可以在 Android 設備上運行的方法,你的應用程序還是需要使用 JAVA 程序,適當的處理系統事件來避免“應用程序沒有反應”的對話框或者處理 Android 應用程序的生命周期

                                          注意:可以適當的在源代碼中寫一個復雜的應用程序,用于啟動/停止一個小型的“應用程序包”

                                          強烈建議很好地理解的 JNI,因為許多操作在這種環境要求的開發人員,都采取具體的行動,不一定在常見典型的本機代碼。這些措施包括:

                                          —-不能通過指針直接訪問 VM 的對象。比如:你不能安全的得到一個指向 String 對象的 16 位 char 數組的循環遍歷

                                          —-需要顯示引用管理本機代碼時候要保持處理 JNI 調用之間的 VM 對象

                                          NDK 在 Android 平臺僅僅提供了有限的本地 API 和庫文件的支持的系統頭文件,然而一個標準的 Android 系統鏡像包括許多本地共享庫,這些都應該被考慮在更新和發行版本的可以徹底改變的實現細節

                                          如果 Android 系統庫沒有明確的被 NDK 明確的支持,然后應用程序不應該依賴于它提供的,或者打破了將來在各種設備上的無線系統更新

                                          選定的系統庫將逐漸被添加到穩定的 NDK API 中

                                          3. NDK開發實踐

                                          下面將給出一個怎樣用 Android NDK 開發本地代碼的粗略的概述

                                          (1) 把本地代碼放在 $PROJECT/jni/…下,比如將 hello.c 放到 apps/hello/jni/目錄下

                                          (2) 在你的 NDK 編譯系統中在 $PROJECT/jni/Android.mk 來描述你的源代碼

                                          (3) 可選:在 $PROJECT/jni/Application.mk 到你的編譯系統中來詳細描述你的項目,盡管你開始的話不一定需要它, 但是它允許你使用更多的 CPU 或者覆蓋編譯器/鏈接器的標記(看 docs/APPLICATION-MK.html 了解更多細節)

                                          (4) 從你的項目的目錄開始通過運行”$NDK/ndk-build”來編譯你的代碼,或者從子目錄開始

                                          (5) 最后一步可以 copy,萬一成功,剝離共享庫的應用層序需要你的應用程序的項目根目錄。然后你通過通常的方法來 生成最終的 apk

                                          現在,開始一些更 的細節

                                          ① 配置 NDK

                                          以前的發行版本需要你運行“build/host-setup.sh”腳本來配置你的 NDK。從 release 4(NDK r)以后就完全去除了這一步

                                          ② 放置 C/C++ 代碼

                                          假如我們創建的是 test 目錄,創建的代碼 hello.c

                                          把 hello.c 放到 test/jni 目錄下

                                          這個項目的位置相當于你的 Android 應用程序項目的路徑

                                          這樣你就很輕松的組織起來了你想要的 jni 的目錄,這里項目目錄的名字和結構不會影響到最終生成的 apk,所以 你不必用類似于 com.. 作為應用程序包名

                                          注意,NDK 是支持 C 和 C++ 的,NDK 支持的 C++ 文件擴展名是’.cpp’,但是其他的擴展名也是可以被處理的 (看 docs/ANDROID-MK.html 了解更多)

                                          它可以通過調整你的 Android.mk 文件來將源代碼放在不同的位置

                                          ③ 創建一個 Android.mk 編譯腳本

                                          Android.mk 文件是一個小型的編譯腳本,你可以在 NDK 編譯系統中用它來描述你的源代碼。更詳細的描述在 docs/ANDROID-MK.html 中

                                          總而言之,NDK 將你的源代碼聚合到模塊(modules)中,每個模塊可以執行下列之一

                                          —-一個靜態庫(lib.a)

                                          —-一個動態庫(lib.so)

                                          你可以在 Android.mk 中定義多個模塊,或者你可以編寫多個 Android.mk 文件,每一個定義一個單獨的模塊

                                          注意,單獨的 Android.mk 也行被編譯系統多次解析,以確定哪些變量沒有被定義。

                                          默認地,NDK 會通過如下的編譯腳本去尋找

                                          test/jni/Android.mk(存放位置)

                                          如果你想定義 Android.mk 到子目錄中,你需要在最高層的 Android.mk 中明確的包含它們,下面是一個幫助的方法可以實現這個功能。

                                              include $(call all-subdir-makefiles)

                                          它會將所有的在子目錄中的 Android.mk 文件加入到當前編譯文件的路徑中

                                          ④ 寫一個 Application.mk 編譯文件(可選)

                                          在你的編譯系統中有一個 Android.mk 文件描述模塊的同時,Application.mk 文件藐視你的應用程序本身。請看 docs/APPLICATION-MK.html 文檔來理解這個文件允許我們做什么。這包括

                                          —-你的應用程序需要模塊的準確清單

                                          —-CPU 架構生成機器代碼

                                          —-可選信息,你是否需要一個 release 或者 debug build,特殊的 C/C++ 編譯器標志和其他適用于所有模塊的 build

                                          這個文件是可選文件:默認地,NDK 會提供一個對于所有的在你的 Android.mk(所有的 makefiles 都在里面)中的所有模塊的簡單編譯并且指定默認的 CPU ABI

                                          使用 Application.mk 有兩種方法:

                                          —-把它放到 test/jni/Application.mk,它就會自動的被’ndk-build’腳本找出來

                                          —-把它放在 NDK//Application.mk,也就是 NDK 安裝的路徑下,然后從 NDK 目錄下執行”make APP=

                                          這個方法是 Android NDK r4 以前的?,F在仍然兼容。但是我們強烈建議你使用第一種方法,因為它更簡單并且不用修改 NDK 安裝樹的目錄。

                                          再次看看 docs/APPLICATION-MK.html 對于它的完整說明

                                          ⑤ 調用 NDK 編譯系統

                                          用 NDK 編譯成機器碼的最好方法是使用”ndk-build”腳本,你還可以使用第二個,這取決于你早起常見的”$NDK/apps”子目錄

                                          在兩種情況下,成功構建將 copy 應用程序所需的最終的已經剝離的二進制模塊(即共享庫)到應用程序的項目路徑中(注意,未剝離的版本主要是用于調試目的,無需拷貝未剝離的二進制文件到設備中)

                                          [1]:使用’ndk-build’命令

                                          ‘ndk-build’腳本位于NDK安裝目錄最頂層,可以直接被應用程序項目目錄(你的AndroidManifest.xml文件所在位置)或者其他任何子目錄

                                          $ cd $PROJECT

                                          $ $NDK/ndk-build(注意是 $NDK/ndkbuild,這是個命令) 將啟動 NDK 的 build 腳本,它會自動探測您開發的系統和應用程序項目文件,以確定 build 設么

                                          例如:

                                          $ndk-build

                                          $ndk-build clean à 清理生成的二進制文件

                                          $ndk-build –B V=1 à 強制完全重新 build,顯示命令

                                          默認的,它期望的是可選文件 $PROJECT/jni/Application.mk 和必須的文件 $PROJECT/jni/Android.mk

                                          成功的話,它講話就復制生成的二進制模塊(即共享庫.so文件)到你的項目樹中的適當位置。您可以在以后重新 build 完整的 Android 應用程序包或者通過“ant”命令,或者 ADT 插件。

                                          可以看 docs/NDK-BUILD.html 來了解更多的信息

                                          [2]:使用 $NDK/apps//Application.mk

                                          這種 build 方法是在 Android NDK r4 版本之前的,不過依然兼容現在的。我們強烈建議您盡可能的使用’ndk-build’,因為我們可能會刪除在以后的 NDK 發行版本中的支持

                                          ① 創建一個子目錄為 $NDK/apps//

                                          ② 在 $NDK/apps//目錄下寫一個 Application.mk 文件,然后需要定義一個 APP_PROJECT_PATH 來執行你的應用程序項目的目錄。

                                          ③ 進入到 NDK 安裝目錄,然后再輸入如下的命令

                                          
                                              $cd $NDK
                                          

                                          注意:輸入 cd $NDK 后,會自動跳到你設置的 ndk 的目錄中

                                          $make APP=

                                          $make APP= -B 表示重新編譯

                                          結果跟第一種方法一樣,除了中間文件被放置到了 $NDK/out/apps//

                                          4. 從新 build 你的應用程序包

                                          在 NDK 生成的二進制文件后,你需要使用一般的方法來重新 build 你的 Android 應用程序包文件(apk),或者用“ant”命令或者 ADT 插件

                                          有關詳細信息,請參閱 Android SDK 的文檔,新的.apk 會嵌入到您的共享庫中,他們將自動提取安裝時由系統安裝的軟件包到你的 Android 設備上

                                          5. 調試支持

                                          NDK 提供了一個服務腳本,名字叫”ndk-gdb”,很容易推出一個應用程序的本地調試會話。

                                          本機調試僅僅能運行在 Android 2.2 或者更高版本,并且不需要 root 權限或者特權訪問,所以可以隨意調試你的應用程序。

                                          有關詳細信息,請閱讀 DOCS / NDK- GDB.html??偫ǘ?,本機調試 遵循這個簡單的計劃:
                                          (1)確保您的應用程序調試(如設置機器人:調試“真”,在您的 AndroidManifest.xml)

                                          (2) “NDK 構建”構建您的應用程序,然后安裝在您的 設備/模擬器

                                          (3)啟動應用程序。

                                          (4)運行“ndk-gdb”從你的應用程序項目目錄。

                                          你會得到一個 gdb 提示符。一個有用的列表,請參閱 GDB 用戶手冊命令。

                                          上一篇:安裝 NDK下一篇:調試
                                          人妻精品动漫h无码中字