Android NDK學習記錄(一)


一、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 生成頭文件

          

 MFirstNDK.zip

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM