天天看點

Android NDK 環境搭建 之 起始篇NDK HelloWorld

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

下載下傳完成之後,解壓搞定。

解壓後的目錄結構如下圖所示:

Android NDK 環境搭建 之 起始篇NDK HelloWorld

打開eclipse,點window->preferences->android->ndk,設定ndk路徑,例如我的是:d:\android\android-ndk_r10-windows

Android NDK 環境搭建 之 起始篇NDK HelloWorld

建立一個android工程,在工程上右鍵點選android tools->add native support… ,然後給我們的.so檔案取個名字,例如我的是:xs_ndk_01

Android NDK 環境搭建 之 起始篇NDK HelloWorld

這時候工程就會多一個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,如下圖:

Android NDK 環境搭建 之 起始篇NDK HelloWorld

再工程右鍵,點properties->c/c++ build的building settings中去掉use default build command,然後輸入${ndkroot}/ndk-build.cmd,如下圖:

Android NDK 環境搭建 之 起始篇NDK HelloWorld

然後建立一個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” {“您的方法在這裡”},大括号裡是您的本地方法(如我上面的例子中那樣寫)。