一、NDK環境在Mac中部署
1.准備eclipse,android sdk安裝包,android ndk安裝包(http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2)
2.部署android開發環境
3.部署NDK開發環境(配置環境變量)
二、編寫基於NDK的HelloWorld
1.它的作用即是把實現了我們在Java code中聲明的native方法的那個libraryload進來,或者load其他什么動態連接庫。
1 static { 2 System.loadLibrary("MFirstNDK"); 3 }
2.native關鍵標識的方法,不需要方法體的抽象方法,是由C/C++來實現的
1 public static native String getStr();
3.MFirstNDK.cpp 文件 用於返回java 本地方法getStr返回的操作實現
1 #include "jni.h" 2 #include "com_threew_ndk_NDKPlus.h" 3 /* 4 * Class: com_threew_ndk_NDKPlus 5 * Method: getStr 6 * Signature: ()Ljava/lang/String; 7 */ 8 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getStr 9 (JNIEnv *env, jclass thiz) { 10 return env->NewStringUTF("hello world JNI"); 11 }
4.編寫好以上文件代碼,就可以在Android Activity里面調用本地方法getStr(),並獲取"hello world JNI"
三、利用Ant工具快速生成java本地方法的.h的頭文件
eclipse中帶有ant插件,可以見在項目下編寫ant xml文件,並添加入ant工作目錄中,雙擊或run as 就可以直接在jni文件夾下生成想要的頭文件。xml內容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- ====================================================================== 3 2014-9-20 上午11:27:05 4 5 MFirstNDK 6 description 7 8 Rubert 9 ====================================================================== --> 10 <project name="MFirstNDK" default="BuildAllHeaders"> 11 <description> 12 description 13 </description> 14 15 <!-- ================================= 16 target: default 17 ================================= --> 18 <target name="BuildAllHeaders"> 19 <antcall target="BuildGetStringHeader"></antcall> 20 <antcall target="BuildGetIntHeader"></antcall> 21 </target> 22 23 <!-- - - - - - - - - - - - - - - - - - 24 target: depends 25 - - - - - - - - - - - - - - - - - --> 26 <target name="BuildGetStringHeader"> 27 <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKInt"></javah> 28 </target> 29 30 <!-- ================================= 31 target: name 32 ================================= --> 33 <target name="BuildGetIntHeader" > 34 <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKPlus"></javah> 35 </target> 36 37 </project>
四.新建c++ class 文件,並用java本地文件調用
1.在jni文件夾下創建Hello的c++文件,會生成Hello.h 和 Hello.cpp文件
2.在Hello.h文件內添加一個方法,內容如下:
1 /* 2 * Hello.h 3 * 4 * Created on: 2014-9-20 5 * Author: Rubert 6 */ 7 8 #ifndef HELLO_H_ 9 #define HELLO_H_ 10 11 class Hello { 12 public: 13 Hello(); 14 char * getWords(); 15 virtual ~Hello(); 16 }; 17 18 #endif /* HELLO_H_ */
3.在Hello.cpp文件的實現方法如下:
1 /* 2 * Hello.cpp 3 * Created on: 2014-9-20 4 * Author: Rubert 5 */ 6 #include "Hello.h" 7 Hello::Hello(){ 8 // TODO Auto-generated constructor 9 } 10 char* Hello::getWords(){ 11 return "hello"; 12 } 13 Hello::~Hello(){ 14 // TODO Auto-generated constructor
4.在MFirstNDK.cpp中的實現如下:
1 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getWords(JNIEnv *env, jclass){ 2 Hello h; 3 return env->NewStringUTF((const char*)h.getWords()); 4 }
5.遇到的問題
在編譯工程中出現,4中得Hello 文件無法找到,前提是我頭文件導入了,但是還是無法通過運行。最后發現是Eclipse錯誤提示的原因:最后是把一些提示都取消掉了
http://www.oschina.net/question/1987532_162259?sort=time
中間發現可能是這個問題,但是導入后依舊如此
http://blog.csdn.net/meegomeego/article/details/8109604
五、基於X86模擬器和Arm模擬
genymotion模擬器 基於X86架構
Android自帶模擬器 基於Arm架構
一般情況下,NDK是生成Arm的so文件,如果想改成X86的so文件。那么就得在工程目錄下,新建一個Application.mk文件,內容如下:
APP_ABI := x86
如果兩者都可以生成,則這么些
APP_ABI := x86 armeabi
六、附
Terminal相關記錄,mac下得終端命令
1.亂碼問題,打開終端,偏好-設置-高級-中文
2.通過cd命令進入文件夾,用open ./ 來打開當前文件夾
3.javah -jni com.xx.xx.xx.Xxx 生成頭文件