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其他什么动态连接库。
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 生成头文件
Android NDK学习记录(一)的更多相关文章
- 【Android】学习记录<1> -- 初识ffmpeg
工作需要用到ffmpeg来进行Android的软编码,对这玩意儿一点都不了解,做个学习记录先. FFmpeg:http://www.ffmpeg.org Fmpeg is the leading mu ...
- Android NDK学习(2)Windows下NDK开发环境配置
转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK ...
- Android NDK 学习之传递类对象
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK学习总结
一.android NDK编程步骤 java文件中声明native方法. android工程根目录新建jni文件夹. 调用javah命令为第一步声明的native方法生成相应的.h头文件. 通过win ...
- Android NDK学习(一):目录结构解析
我们配置好NDK环境后,基本可以看到其目录结构如下图: 下面我们来分析一下NDK根目录的结构: ndk-build:该Shell脚本是Android NDK构建系统的起始点,一般在项目中仅仅执行这一个 ...
- Android NDK学习(1) 简介
转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817385.html 一.What is the NDK? The Android ...
- Android NDK 学习之在C中抛出异常
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK 学习之调用Java函数
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK 学习之在C中调用Java的变量和静态变量
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
随机推荐
- shell脚本报错退出
在shell脚本中,比如有以下的代码: cd /root/test88 rm -rf backup 如果目录/root/test88不存在,脚本不会停止,依然会执行rm -rf backup这个命令 ...
- 【树形dp】Apple Tree
[poj2486]Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10800 Accepted: 3 ...
- 【BFS/DFS/YY】派对灯
[luogu1468]派对灯 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将 ...
- 【数论】【二次剩余】【map】hdu6128 Inverse of sum
部分引用自:http://blog.csdn.net/v5zsq/article/details/77255048 所以假设方程 x^2+x+1=0 在模p意义下的解为d,则答案就是满足(ai/aj) ...
- Django contenttypes 框架详解
一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...
- ArrayList之扩容与迭代器
1. 扩容 ArrayList扩容包括ensureCapacity(对外开放)和ensureCapacityInternal(内部隐式调用)两个接口: 1' 两者都调用ensureExplicitCa ...
- 141.最小m 段和问题--划分性DP(特殊数据)
3278 最小m 段和问题 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定 n 个整数(不一定是正整 ...
- Codeforces Beta Round #2 B. The least round way dp
B. The least round way 题目连接: http://www.codeforces.com/contest/2/problem/B Description There is a sq ...
- C\C++宏大全
一.标准预定义宏The standard predefined macros are specified by the relevant language standards, so they are ...
- 移动端调试神器(eruda)
在日常的移动端开发时,一般都是试用chrome浏览器的移动端模式进行开发和调试,只有在chrome调试完成,没有问题了才会上到真机测试,移动端开发的一大问题就在于此, 各种品牌各种型号手机,手机中各种 ...