Linux Android NDK
1、NDK是什麼?NDK 的全稱是Native Development Kit,在JAVA里也有個JNI(Java Native Interface)的概念,可以在JAVA中訪問一些C/C++的代碼。大家知道在Android SDK里是無法編譯C/C++代碼的,NDK的作用就是實現C/C++代碼的編譯。但是Android也不希望開發者將自己的Native代碼直接運行, 所以NDK看來只能支持開發JNI代碼並打包到相應APK中。NDK里提供了下面這些頭文件,當然也包含動態庫。OpenGL ES 1.1需要Android 1.6才支持,OpenGL ES 2.0需要2.0以上系統才支持。
2、NDK安裝如果熟悉Linux,安裝起來相當的簡單。NDK下載地址:
http://dl.google.com/android/ndk/android-ndk-r3-linux-x86.zip下載完後解開:$ unzip android-ndk-r3-linux-x86.zip進入SDK目錄,安裝環境變數:$ cd android-ndk-r3$ build/host-setup.shChecking host development environment.NDK Root : /home/android/android-ndk-r3GNU Make : make (version 3.81)Awk : awkPlatform : linux-x86Generate : out/host/config.mkToolchain : Checking for arm-eabi-4.2.1 prebuilt binariesHost setup complete. Please read docs/OVERVIEW.TXT if you don"t know what to do.安裝安成,這裡不要用「. build/host-setup.sh」或「source build/host-setup.sh」,會直接退出當前shell會話。3、 NDK示常式序在NDK目錄apps下有幾個示常式序:$ ls appshello-gl2 hello-jni san-angeles two-libs unit-tests這裡分析下hello-jni:apps/hello-jni/|-- Application.mk`-- project |-- AndroidManifest.xml |-- default.properties |-- jni | |-- Android.mk | `-- hello-jni.c |-- res | `-- values | `-- strings.xml |-- src | `-- com | `-- example | `-- hellojni | `-- HelloJni.java `-- tests |-- AndroidManifest.xml |-- default.properties `-- src `-- com `-- example `-- HelloJni `-- HelloJniTest.java可以看到project、project/tests里是SDK支持的項目代 碼,project/jni里是JNI代碼。我們用Eclipse打開project,打開後項目名稱為「HelloJni」,編譯並運行,出現了以下問 題:
從日誌中看出是載入JNI代碼未成功。編譯JNI代碼後刷新HelloJni工程,重新編譯運行成功,如圖。
編譯JNI的方法是回到NDK目錄,然後執行make:$ make APP=hello-jniAndroid NDK: Building for application "hello-jni" Compile thumb : hello-jni <= apps/hello-jni/project/jni/hello-jni.cSharedLibrary : libhello-jni.soInstall : libhello-jni.so => apps/hello-jni/project/libs/armeabi生成JNI庫後,重新編譯的APK中已經把libhello- jni.so打包了進來。安裝APK後JNI庫會一併安裝到/data/data /com.example.hellojni/lib/libhello-jni.so。APP後面指定的名字需要同apps下的目錄名 和Android.mk里的MODULE名一致,project/jni的目錄層次也是固定的。其實NDK並非只能編譯JNI,在project/jni下編譯可執行文件也沒有問題,不過NDK里的頭文件和庫非常有限。
推薦閱讀:
※Android 4.3 新增的 "App Ops" 隱私控制功能怎麼用,對比同類應用體驗如何?
※個人開發者做應用,選擇安卓平台還是蘋果平台更賺錢?
※不買Samsung(三星) Galaxy S6和S6 Edge的理由?
※GoSSIP 論文推薦(2017-06-28)