一、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             description13     </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

更多相关文章

  1. android系统中“关于设备”中android版本和android安全补丁信息
  2. 关于Android中xml布局文件
  3. android之webView加载javascropt
  4. Android(安卓)NDK环境搭建及sample展示
  5. Android(安卓)下载文件及写入SD卡
  6. android 几个常用命令
  7. 高焕堂android中文书全,电子文件for version 1.0
  8. Android编译过程详解
  9. android 入门xml布局文件

随机推荐

  1. 解决MySql8.0 查看事务隔离级别报错的问
  2. MySQL主从同步原理及应用
  3. MySQL UPDATE 语句一个“经典”的坑
  4. 一条SQL语句在MySQL中是如何执行的
  5. 一次现场mysql重复记录数据的排查处理实
  6. MyBatis 动态SQL全面详解
  7. MySQL中datetime时间字段的四舍五入操作
  8. 浅谈MySQL表空间回收的正确姿势
  9. mysql如何能有效防止删库跑路
  10. 浅谈MySQL函数