windows安卓NDK編程

來源:互聯網
上載者:User

標籤:安卓   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編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.