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
Android NDK学习记录(一)相关推荐
- Android动画学习记录二(属性动画、估值器和插值器)
Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) 一.补间动画缺陷 二.属性 ...
- Android 开发学习记录(4)---- httpclient使用(三)
之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户. 但是现在好多网站在登录时 ...
- Android Studio学习记录之简单的页面切换及宫格菜单
Android Studio学习记录之简单的页面切换及宫格菜单 之前上课听老师讲的一些东西自己其实并没有消化,今天把不懂的都去网上搜了一下,有了一种恍然大悟的感觉,包括很多方方面面的东西.有些东西听说 ...
- Android动画学习记录一(Android动画种类、补间动画和帧动画)
Android动画学习记录一(动画种类.补间动画和帧动画) 动画种类.补间动画和帧动画 Android动画学习记录一(动画种类.补间动画和帧动画) 一.动画种类 二.View动画 2.1 补间动画 补 ...
- Android socket 学习记录 之 执行new socket(ip, port)程序崩溃
这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少 ...
- Android NDK学习笔记(转)
前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...
- Android NDK学习笔记1:基础
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...
- Android NDK学习(2)
写在前面 本文需要一些CMake 和 JNI的基础知识,对于CMake的使用推荐Android官网的NDK入门.CMake是Android Studio 2.2以上新增的支持原生编程的工具,CMake ...
- Android NDK 学习汇总
一,JNI 入门 二,JNI 基础 三,Android.mk 和 CMake 语法 四,Android Studio 中使用 NDK 五,NDK 开发 六,其它
最新文章
- ios 监听一个控制器的属性_OC观察者模式之KVO的使用与思考
- java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序
- 第二章 用户画像建模
- 推荐几款好用实用的宝藏软件。记得收藏
- 物料编码在PDM与ERP集成中的应用研究
- Java高阶知识体系总结(一)
- 大数据培训(第三季)——Linux基础-徐培成-专题视频课程
- discuz发帖流程_C#代码、流程discuz论坛批量或自动发帖
- gromacs 安装_GROMACS安装专述
- 面了一个37岁的程序员,我很慌......
- java split 字符串作为分隔符_Java 字符串分隔 split
- 吃货联盟订餐系统(用数组写的)
- thinkPHP基于php的衡水游泳馆管理系统--php-计算机毕业设计
- 基于身高与体重数据集与Auto数据集分别进行线性回归和Lasso回归(代码逐行讲解,超细节)
- 阿里云学生服务器配置及免费学生机领取攻略
- SendEMail 发送邮件
- 天文相关Python资料收集
- uno牌的玩法图解_UNO牌标准版简介及规则说明
- 挑战华为社招:掌握数据库其实很容易
- PDF转word文档(java)
热门文章
- usaco-3.3-shopping-passed
- 2008 Gartner ITxpo 展 10 大 IT 产品
- 【C++笔记】封装的意义,结构体和类的区别
- 数据结构笔记(三十二)--二叉排序树的基本概念与查找
- python并发循环_在Python中模拟一个并发循环?
- github 仓库管理及代码上传
- 开放大学计算机应用基础第三次,江苏开放大学-计算机应用基础第三次.doc
- c语言编程作业 一哥是何人,PLC编程语言之争:谁才是quot;一哥quot;-简易百科
- java 定时程序扫描表_Java扫描程序类
- android逐行写入读取_Android外部存储-读取,写入,保存文件