adt插件:管理android sdk和相關的開發工具的
ndk插件:用于開發android ndk的插件,adt版本在20以上,就能安裝ndk插件,另外ndk內建了cdt插件(是以本文直接針對adt 20以上版本進行說明)
到android官網下載下傳最新的ndk,注:ndk版本在r7以上之後就內建了cygwin,而且還是十分精簡版。比起下載下傳cygwin要友善多啦(cygwin以前需要單獨安裝和配置,現在已被內建)!
下載下傳連結見:http://developer.android.com/tools/sdk/ndk/index.html
下載下傳完成之後,解壓搞定。
解壓後的目錄結構如下圖所示:
打開eclipse,點window->preferences->android->ndk,設定ndk路徑,例如我的是:d:\android\android-ndk_r10-windows
建立一個android工程,在工程上右鍵點選android tools->add native support… ,然後給我們的.so檔案取個名字,例如我的是:xs_ndk_01
這時候工程就會多一個jni的檔案夾,jni下有android.mk和xs_ndk_01.cpp檔案。android.mk是ndk工程的makefile,xs_ndk_01.cpp就是ndk的源檔案。
(關于 android.mk 的說明可以參考資料:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/13/2137577.html)
jni接口的命名規範是:java_ + 調用該方法的包名(包名的點用代替) + + 調用該接口的類名 + _ + 方法名,對于執行個體方法,有兩個參數是必要的,一個jni的環境指針jnienv *,另一個是調用該方法的java執行個體jobject
接下來編輯xs_ndk_01.cpp檔案,寫一個helloworld的demo,代碼如下:
完成了,然後運作。運作之前先編譯ndk,然後在編譯java代碼。編譯也許會遇到unable to launch cygpath. is cygwin on the path?如何解決?
eclipse -> window -> preperences -> c/c++ -> build -> environment 添加一個環境變量ndkroot,如下圖:
再工程右鍵,點properties->c/c++ build的building settings中去掉use default build command,然後輸入${ndkroot}/ndk-build.cmd,如下圖:
然後建立一個activity調用我們剛剛編寫的helloworld,代碼如下:
至此,我們就完成了一個簡單的例子,如需更進一步對ndk進行開發,請查閱相關資料。
=====================================
下面幾種可能出現的錯誤的解決方案(如果直接按我上面的例子,是不會出現下面的錯誤的):
1、method ‘newstringutf’ could not be resolved 問題(方法“newstringutf”無法被解析)
原因:
項目右鍵->properties->c/c++general->code analysis,選擇”use project settings或者use workspace settings” 中的 method cannot be resolved(方法無法被解析)取消選擇,應用->儲存,然後重新整理、清理、重新整理、build項目。
2、jni/hellocpp/main.cpp:16:18: error: base operand of ‘->’ has non-pointer type ‘jnienv {aka _jnienv}’ 問題
這是 android java 調用c++程式時報的錯誤
檔案 xs_ndk_01.cpp 檔案代碼,按如下方式編寫出現的錯誤:
錯誤在于:
我開始是 (*env)->newstringutf(env, “小單 的 jni hellworld 程式.”); 這樣寫的,這是c的寫法(檔案應該是.c擴充名),而我的是cpp程式(.cpp擴充名),需要改寫成:
env->newstringutf( “小單 的 jni hellworld 程式.”);
3、 java.lang.unsatisfiedlinkerror: native method not found: com.shanhy.example.ndk01.mainactivity.getstringfromjni:()ljava/lang/string; 錯誤
有可能是:
1、c++中的方法java_xxx_xxx 中的java 首字母一定要大寫
2、如果是 .cpp 檔案 則用 extern “c” {“您的方法在這裡”},大括号裡是您的本地方法(如我上面的例子中那樣寫)。