標籤:安卓 ndk
去年搞過一次NDK,當時覺得挺麻煩,以後就一直沒再搞過,現在公司的項目需要使用NDK編程,今天又搞了一邊,遇到了些問題,和大家分享一下
.
一. 安裝Cygwin
1.下載Cygwin http://cygwin.com/setup-x86.exe 雙擊運行出現如下介面,點擊下一步
選擇install from internet ,點擊下一步
選擇預設位置 c:\cygwin ,點擊下一步
依舊預設位置,繼續點擊下一步
預設選項Direct Connection 就可以,繼續點擊下一步
可以選擇網易163伺服器,繼續下一步
出現下面介面
選擇需要安裝Cygwin組件 : 這裡我們只需要以下組件 : binutils , gcc , gcc-mingw , gdb , make , 不用下全部的組件;
例如輸入gcc 後下面會自動列出各組件,點擊All右邊的單詞,直到下面都變成install為止,然後點擊下一步就可以等待安裝了,安裝完後點擊上一步就又回到該介面,
另外幾個組件安裝方式同上。
安裝完後目錄是這樣的
雙擊上面目錄中的Cygwin.bat ,在啟動的視窗中輸入make -version ,若出現類似下面介面,表示安裝成功
二.下載ndk
1.- windows版本NDK:android-ndk-r9c-windows-x86.zip (32位),android-ndk-r9c-windows-x86_64.zip (64位) 該版本是用在windows上的Cygwin下, 不能直接在windows上直接運行;
2.下載完後解壓並放到C:\\cygwin\中,目錄結構如下
三.建立安卓工程
1.建立安卓工程,並在工程根目錄下建立jni檔案夾,
2.運行一下工程,讓工程中的bin檔案夾中產生class檔案,(class檔案在工程中的bin中看不到,可以從資源管理員中開啟該bin檔案夾)
3.產生對應的標頭檔
例 可以通過這種方式產生標頭檔 javah -classpath F:/ndkTest/bin/classes -d c:/ -jni com.example.ndktest.TestJNI
(F:\ndkTest\bin\classes 是包所在目錄 , c:/表示產生的標頭檔存放位置,com.example.ndktest.TestJNI 是包.類名)
(備忘 下面的控制台不是windows的命令視窗,而是 C:\cygwin中的Cygwin.bat )
把c盤中產生的com_example_ndktest_TestJNI.h複製到安卓工程中的jni檔案夾
在jni檔案夾中建立.cpp檔案,如 main.cpp ,然後使用include命令包含.h檔案,並把.h檔案中的函數複製到main.cpp中,記得要給複製過來的函數加上參數,同時把末尾的;改成 { } ,該例子中使用NewStringUTF建立了一個utf8編碼的字串並返回
在jni檔案夾中編寫Android.mk檔案 mk檔案一定要當心,寫錯後不會報錯,但調用時卻會拋異常
擷取當前檔案內容 : $(call my-dir) 是編譯器中的宏方法, 調用該宏方法, 就會
返回前的目錄路徑;
賦值符號 : " := " 是
賦值符號, 第一句話 是 返回當前檔案所在的目前的目錄, 並將這個目錄路徑賦值給 LOCAL_PATH;
初始化編譯模組參數 : $(CLEAR_VARS) 作用是將編譯模組的參數初始化, LOCAL_MODULE LOCAL_SRC_FILES 也是這樣的參數;
指定編譯模組 : LOCAL_MODULE := hello , 指定編譯後的 so 檔案名稱, 編譯好之後系統會在該名稱前面加上 "lib", 尾碼加上 ".so";
指定編譯源檔案 : LOCAL_SRC_FILES := main.cpp 告訴編譯系統源檔案, 如果有多個檔案那麼就依次寫在後面即可;
編譯成靜態庫 : include $(BUILD_SHARED_LIBRARY), 作用是高速系統, 編譯的結果編譯成 .so 尾碼的靜態庫;
靜態庫引入 : NDK的platform中有很多 ".a" 結尾的動態庫, 我們編譯動態庫的時候, 可以將一些靜態庫引入進來;
為了防止手動輸入錯誤,直接把代碼放在這,大家可以直接複製後修改一下
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=TestJNI
LOCAL_SRC_FILES := main.cpp
include $(BUILD_SHARED_LIBRARY)
在安卓工程根目錄下建立Application.mk檔案,並輸入如下內容 ,注意 APP_MODULES 值要和Android.mk中 LOCAL_MODULE 值一樣
同樣把代碼放在這,方便大家複製
APP_PROJECT_PATH:=$(call my-dir)
APP_MODULES:=TestJNI
四.編譯
啟動c:\\cygwin中Cygwin.bat,輸入 cd 你的工程所在絕對位置 我的工程在f盤中,工程名叫ndkTest,所以輸入cd f:/ndkTest,注意下線方向
輸入/android-ndk-r9c/ndk-build ,我的android-ndk-r9c在C:\cygwin中,所以可以直接這樣輸 參見 二.下載 2.中目錄結構
輸入完後斷行符號,會出現如下提示,表示產生so庫成功
重新整理一下安卓工程,在libs中armeabi中看到產生的lib開頭,.so結尾的庫 (右擊安卓工程名,選擇refresh即可重新整理工程)
在調用聲明的native函數前要先調用System.loadLibrary() ,調用一次即可,參數是類庫的名字,注意,不包括開頭的lib和結尾的.so
安卓ndk編程到此就完結了。
五.注意事項
有的安卓工程中還有armeabi-v7a檔案夾,記得把產生的so庫也要拷貝到該檔案夾中一份。
mk檔案輸入錯誤後不會報錯,直到調用時才會拋出異常,一定要小心
備忘:以上在windows7 旗艦版 32位 sp1 ,i3處理器上編譯通過,在 安卓arm模擬器上測試通過,小米note 上測試通過
如有轉載請註明出處 謝謝
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
windows安卓NDK編程