一、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其他什么动态连接库。

 static {
System.loadLibrary("MFirstNDK");
}

2.native关键标识的方法,不需要方法体的抽象方法,是由C/C++来实现的

 public static native String getStr();

3.MFirstNDK.cpp 文件  用于返回java 本地方法getStr返回的操作实现

 #include "jni.h"
#include "com_threew_ndk_NDKPlus.h"
/*
* Class: com_threew_ndk_NDKPlus
* Method: getStr
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getStr
(JNIEnv *env, jclass thiz) {
return env->NewStringUTF("hello world JNI");
}

4.编写好以上文件代码,就可以在Android Activity里面调用本地方法getStr(),并获取"hello world JNI"

三、利用Ant工具快速生成java本地方法的.h的头文件

eclipse中带有ant插件,可以见在项目下编写ant xml文件,并添加入ant工作目录中,双击或run as 就可以直接在jni文件夹下生成想要的头文件。xml内容如下:

 <?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2014-9-20 上午11:27:05 MFirstNDK
description Rubert
====================================================================== -->
<project name="MFirstNDK" default="BuildAllHeaders">
<description>
description
</description> <!-- =================================
target: default
================================= -->
<target name="BuildAllHeaders">
<antcall target="BuildGetStringHeader"></antcall>
<antcall target="BuildGetIntHeader"></antcall>
</target> <!-- - - - - - - - - - - - - - - - - -
target: depends
- - - - - - - - - - - - - - - - - -->
<target name="BuildGetStringHeader">
<javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKInt"></javah>
</target> <!-- =================================
target: name
================================= -->
<target name="BuildGetIntHeader" >
<javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKPlus"></javah>
</target> </project>

四.新建c++ class 文件,并用java本地文件调用

1.在jni文件夹下创建Hello的c++文件,会生成Hello.h 和 Hello.cpp文件

2.在Hello.h文件内添加一个方法,内容如下:

 /*
* Hello.h
*
* Created on: 2014-9-20
* Author: Rubert
*/ #ifndef HELLO_H_
#define HELLO_H_ class Hello {
public:
Hello();
char * getWords();
virtual ~Hello();
}; #endif /* HELLO_H_ */

3.在Hello.cpp文件的实现方法如下:

 /*
* Hello.cpp
* Created on: 2014-9-20
* Author: Rubert
*/
#include "Hello.h"
Hello::Hello(){
// TODO Auto-generated constructor
}
char* Hello::getWords(){
return "hello";
}
Hello::~Hello(){
// TODO Auto-generated constructor

4.在MFirstNDK.cpp中的实现如下:

 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getWords(JNIEnv *env, jclass){
Hello h;
return env->NewStringUTF((const char*)h.getWords());
}

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】学习记录<1> -- 初识ffmpeg

    工作需要用到ffmpeg来进行Android的软编码,对这玩意儿一点都不了解,做个学习记录先. FFmpeg:http://www.ffmpeg.org Fmpeg is the leading mu ...

  2. Android NDK学习(2)Windows下NDK开发环境配置

    转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK   ...

  3. Android NDK 学习之传递类对象

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  4. Android NDK学习总结

    一.android NDK编程步骤 java文件中声明native方法. android工程根目录新建jni文件夹. 调用javah命令为第一步声明的native方法生成相应的.h头文件. 通过win ...

  5. Android NDK学习(一):目录结构解析

    我们配置好NDK环境后,基本可以看到其目录结构如下图: 下面我们来分析一下NDK根目录的结构: ndk-build:该Shell脚本是Android NDK构建系统的起始点,一般在项目中仅仅执行这一个 ...

  6. Android NDK学习(1) 简介

    转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817385.html 一.What is the NDK? The Android ...

  7. Android NDK 学习之在C中抛出异常

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  8. Android NDK 学习之调用Java函数

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  9. Android NDK 学习之在C中调用Java的变量和静态变量

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

随机推荐

  1. 洛谷——P2035 iCow

    P2035 iCow 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N < ...

  2. Web应用主动侦测工具Skipfish

    Web应用主动侦测工具Skipfish   Skipfish是Kali Linux附带的一个主动Web应用侦测工具.该工具会首先尽可能获取所有网站路径,进行访问,然后根据返回的内容,检测是否存在漏洞. ...

  3. Python的zip函数(转)

    原文地址:http://www.cnblogs.com/frydsh/archive/2012/07/10/2585370.html zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tu ...

  4. [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)

    4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 832  Solved: 342[Submit][Statu ...

  5. [Codeforces-div.1 494C] Helping People

    [Codeforces-div.1 494C] Helping People 试题分析 不难注意到题目所给的性质是一棵树,所以肯定是树形dp. 那么期望没有办法合并,我们还有一种最笨的方法就是求出概率 ...

  6. python基础之数据类型之元组和字典

    四.元组 1.用途:元组是不可变的列表,能存多个值,但只能取,不能改 2.定义:name = (‘alex’, ’egon’, ‘wxx’) 在()内用,分割开,可存放任意类型的值 强调:x = (‘ ...

  7. 20172333 2017-2018-2 《Java程序设计》第5周学习总结

    20172333 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容 1.if语句.if-else语句.switch语句 都是通过对于布尔表达式的结果来进行是否执行下 ...

  8. Cloud Foundry中vmc tunnel与caldecott原理

    在Cloud Foundry中,用户可以vmc create-service创建一个service instance,但是常规情况下,用户不能手动地进一步对service instance进行设计.以 ...

  9. JavaScript 时间与日期处理实战:你肯定被坑过

    本部分的知识图谱请参考编程语言知识图谱-时间与日期. 本文JavaScript 时间与日期处理实战:你肯定被坑过从属于笔者的Web 前端入门与最佳实践中 JavaScript 入门与最佳实践系列文章. ...

  10. GNU C内联汇编(AT&amp;T语法)

    转:http://www.linuxso.com/linuxbiancheng/40050.html 内联汇编提供了可以在C或C++代码中创建汇编语言代码,不必连接额外的库或程序.这种方法对最终程序在 ...