Android的NDK開發步驟

一個超級快配置NDK的辦法:(NDK DEMO)php

 

第一步:html

到Android官網下載Android的開發工具ADT(Android Development Tool的縮寫),該工具集成了最新的ADT和NDK插件以及Eclipse,還有一個最新版本SDK。解壓以後就能夠用了。java

ADT插件:管理Android SDK和相關的開發工具的android

NDK插件:用於開發Android NDK的插件,ADT版本在20以上,就能安裝NDK插件,另外NDK集成了CDT插件。也能夠在線更新ADT、NDK插件app

 

第二步:ide

到Android官網下載最新的NDK,注:NDK版本在r7以上以後就集成了Cygwin,並且仍是十分精簡版。比起下載Cygwin要方便多啦!下載連接見:http://developer.android.com/tools/sdk/ndk/index.html函數

 

第三步:工具

打開Eclipse,點Window->Preferences->Android->NDK,設置NDK路徑,例如E:/android-ndk-r9c開發工具

 

第四步:ui

新建一個Android工程,在工程上右鍵點擊Android Tools->Add Native Support...,而後給咱們的.so文件取個名字,例如:my-ndk

這時候工程就會多一個jni的文件夾,jni下有Android.mk和my-ndk.cpp文件。Android.mk是NDK工程的Makefile,my-ndk.cpp就是NDK的源文件。

 

第五步:

接下來仿着NDK的demo,Hello-JNI工程寫一下。使用Alt + '/'能夠代碼提示

JNI接口的命名規範是:Java_ + 調用該方法的包名(包名的點用_代替) + _ + 調用該接口的類名 + _ + 方法名,對於實例方法,有兩個參數是必要的,一個JNI的環境指針JNIEnv *,另外一個是調用該方法的Java實例jobject

my-ndk.cpp:

 #include JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,jobject thiz) {  

  return env->NewStringUTF("Hello jni");}


TestActivity. java:

public class TestActivity extends Activity { static { System.loadLibrary("my-ndk"); } // 聲明JNI層的原生方法,使用native關鍵字 public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tvText = new TextView(this); tvText.setText(stringFromJNI()); setContentView(tvText); }}


使用ndk庫必須在static代碼塊裏面用System.loadLaibrary加載.so庫
 

第六步:

完成了,而後運行。運行以前先編譯NDK,而後在編譯JAVA代碼。編譯也許會遇到Unable to launch cygpath. Is Cygwin on the path?錯誤,解決辦法以下:

1.工程右鍵,點Properties->C/C++ Build的Building Settings中去掉Use default build command,而後輸入${NDKROOT}/ndk-build.cmd

2.在C/C++ Build中點擊Environment,點Add...添加環境變量NDKROOT,值爲NDK的根目錄

3.再編譯,問題就解決啦!

運行時崩潰,遇到java.lang.UnsatisfiedLinkError: stringFromJNI錯誤,解決辦法:在C++文件中函數定義前添加extern "C"修飾

 

extern "C" {JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,		jobject thiz);}JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,		jobject thiz) {	return env->NewStringUTF("Hello jni");}

緣由是:使用extern "C"修飾,編譯器會按C語言的方式編譯和鏈接。在C語言中, 函數編譯以後函數名與C++函數編譯以後不一樣,例如foo(int x, int y),C可能會編譯成_foo的名字,而C++由於支持重載,因此會編譯成像_foo_int_int這種帶參數的函數名。若是是按照C語言的編譯方式,調用foo函數是找不到_foo的函數名就會報出函數名找不到的錯誤。因此要添加extern "C"修飾。

 

 參考文章:

http://blog.csdn.net/pi9nc/article/details/28855737
http://www.2cto.com/kf/201403/288157.html
http://www.th7.cn/Program/Android/201404/189197.shtml

相關文章
相關標籤/搜索