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

Android NDK学习记录(一)相关推荐

  1. Android动画学习记录二(属性动画、估值器和插值器)

    Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) 一.补间动画缺陷 二.属性 ...

  2. Android 开发学习记录(4)---- httpclient使用(三)

    之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户. 但是现在好多网站在登录时 ...

  3. Android Studio学习记录之简单的页面切换及宫格菜单

    Android Studio学习记录之简单的页面切换及宫格菜单 之前上课听老师讲的一些东西自己其实并没有消化,今天把不懂的都去网上搜了一下,有了一种恍然大悟的感觉,包括很多方方面面的东西.有些东西听说 ...

  4. Android动画学习记录一(Android动画种类、补间动画和帧动画)

    Android动画学习记录一(动画种类.补间动画和帧动画) 动画种类.补间动画和帧动画 Android动画学习记录一(动画种类.补间动画和帧动画) 一.动画种类 二.View动画 2.1 补间动画 补 ...

  5. Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

    这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少 ...

  6. Android NDK学习笔记(转)

    前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...

  7. Android NDK学习笔记1:基础

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...

  8. Android NDK学习(2)

    写在前面 本文需要一些CMake 和 JNI的基础知识,对于CMake的使用推荐Android官网的NDK入门.CMake是Android Studio 2.2以上新增的支持原生编程的工具,CMake ...

  9. Android NDK 学习汇总

    一,JNI 入门 二,JNI 基础 三,Android.mk 和 CMake 语法 四,Android Studio 中使用 NDK 五,NDK 开发 六,其它

最新文章

  1. ios 监听一个控制器的属性_OC观察者模式之KVO的使用与思考
  2. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序
  3. 第二章 用户画像建模
  4. 推荐几款好用实用的宝藏软件。记得收藏
  5. 物料编码在PDM与ERP集成中的应用研究
  6. Java高阶知识体系总结(一)
  7. 大数据培训(第三季)——Linux基础-徐培成-专题视频课程
  8. discuz发帖流程_C#代码、流程discuz论坛批量或自动发帖
  9. gromacs 安装_GROMACS安装专述
  10. 面了一个37岁的程序员,我很慌......
  11. java split 字符串作为分隔符_Java 字符串分隔 split
  12. 吃货联盟订餐系统(用数组写的)
  13. thinkPHP基于php的衡水游泳馆管理系统--php-计算机毕业设计
  14. 基于身高与体重数据集与Auto数据集分别进行线性回归和Lasso回归(代码逐行讲解,超细节)
  15. 阿里云学生服务器配置及免费学生机领取攻略
  16. SendEMail 发送邮件
  17. 天文相关Python资料收集
  18. uno牌的玩法图解_UNO牌标准版简介及规则说明
  19. 挑战华为社招:掌握数据库其实很容易
  20. PDF转word文档(java)

热门文章

  1. usaco-3.3-shopping-passed
  2. 2008 Gartner ITxpo 展 10 大 IT 产品
  3. 【C++笔记】封装的意义,结构体和类的区别
  4. 数据结构笔记(三十二)--二叉排序树的基本概念与查找
  5. python并发循环_在Python中模拟一个并发循环?
  6. github 仓库管理及代码上传
  7. 开放大学计算机应用基础第三次,江苏开放大学-计算机应用基础第三次.doc
  8. c语言编程作业 一哥是何人,PLC编程语言之争:谁才是quot;一哥quot;-简易百科
  9. java 定时程序扫描表_Java扫描程序类
  10. android逐行写入读取_Android外部存储-读取,写入,保存文件