Android NDK开发之从环境搭建到Demo级十步流
写在正文之前:
几个月没有更新博客,感觉有点生疏了,所以说不能断,一断人就懒。
其实这几个月也并不是什么事也没有做,俺可是时刻想着今年的任务呢,10本书,30篇博文...,这几个月间断性的也是在学习中,学H5,学设计模式,以及NDK JNI开发等等。
学习JNI主要是因为公司有一些COCOS游戏需要添加计费点,而又没有真正的游戏开发人员,这个重任就落到我身上了,然后就是各种虐,一虐到底,苦不堪言,这种虐并不是学习技术的虐,而是一款游戏用于N种计费点,不停的改改改,那个需求这个需要的,然后你就等着被玩吧。
正文
OK,言归正传,说到NDK,相信大家都不陌生,它是Google为便于Android开发提供的一种原生开发集:Native Development Kit,而且也是一个包含API、构建工具、交叉编译、调试器、文档示例等一系列的工具集,可以帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成APK。
与NDK密切相关的另一个词汇则是JNI,它是NDK开发中的枢纽,Java与底层交互绝大多数都是通过它来完成的,那么接下来看看什么是JNI?
JNI:Java Native Interface 也就是java本地接口,它是一个协议,这个协议用来沟通java代码和本地代码(c/c++)。通过这个协议,Java类的某些方法可以使用原生实现,同时让它们可以像普通的Java方法一样被调用和使用,而原生方法也可以使用Java对象,调用和使用Java方法。也就是说,使用JNI这种协议可以实现:java代码调用c/c++代码,而c/c++代码也可以调用java代码。
那为什么要使用NDK开发呢?
我们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。
在一些复杂性的计算中,要求高性能的场景中,C/C++更加的有效率,代码也更便于复用。
当然还有其他的优点,这些都驱使我们选择相对来说高效和安全的DNK来开发我们的应用程序。
OK,说了那么多NDK,那到底怎么使用NDK来开发应用程序呢?
俗话说,工欲善其事必先利其器,想要使用NDK开发,必先打磨好工具。那下面首先来看看DNK的环境搭建吧。
NDK的环境搭建
安装配置NDK
首先下载NDK,这里我使用的是android-ndk-r14b-windows-x86_64,可以自主选择。
1). 解压NDK的zip包,注意路径目录不要出现空格和中文,这里建议大家把包解压到SDK目录里面,并命名为ndk-bundle,好处是,启动AS的时候会检查它并直接添加到ndk.dir中,减少我们的配置工作;
2). 配置path : 把解压好的路径添加到环境变量path中;
3).ndk-build:cd到解压后NDK的根目录,执行ndk-build命令。
给AS配置关联NDK,这里我使用的是androidstudio,使用Eclipse的会有所不同,请自行查找资料来配置。
1). 在建立的工程中的local.properties中添加如下配置
ndk.dir=D:\guanmanman\androidStudio\sdk\ndk-bundle,这里注意下要使用转义字符“\”来进行字符转义。如果ndk目录是存放在SDK中,并命名为ndk-bundle,这个配置会自动为添加上去。
2). 在工程中gradle.properties中添加对旧版本的NDK支持的配置
android.useDeprecatedNdk=true
OK,到这里我们基本的NDK环境配置已基本完成,那接下来就开始我们的NDK开发旅程吧。
Demo实例之调用本地无参方法直接返回字符串
一 layout布局
直接在layout中添加一个按钮Button控件,用于点击调用本地方法:
二 在MainActivity中获取该控件并注册它的点击监听器
三 创建Java2CJNI类及本地方法
在我们的包下直接创建一个Java2CJNI类,并在类里创建一个java2C的本地方法:
四 通过javah命令获取到本地头文件
在项目根目录下,进入main->java目录,全选文件目录栏,直接输入cmd命令并按回车键进入docs命令,在命令中执行javah com.sanhui.ndkdemo.Java2CJNI命令:
执行完javah命令后,会在java当前目录下创建一个.h的头文件
五 在main目录下创建一个jni文件夹,并把(四)中的头文件转移到该文件夹下
打开该文件夹可以看到系统为我们创建好的本地方法头文件。
六 创建实现头文件的.C源文件
在jni目录下创建一个Java2C.c的源文件,通过#include引入我们的头文件com_sanhui_ndkdemo_Java2CJNI.h,并把在头文件下的声明方法JNIEXPORT jstring JNICALL Java_com_sanhui_ndkdemo_Java2CJNI_java2C(JNIEnv *, jobject);复制到我们的Java2C.c中,补全方法参数,并实现一个C字符串“I am From Native C .”的返回:
OK,至此我们的代码已编写完毕,接下来我们需要配置编译后的so名称和支持的cpu类型。
七 在该项目下的build.gradle配置生成的so名称和支持的cpu类型
在android->defaultConfig下添加如下代码:
ndk{
moduleName "Java2C" //so文件名
abiFilters "armeabi", "armeabi-v7a", "x86" //CPU类型
}
当然在这里不配置也是可以的,系统会用默认的项目名称作为so文件的名称,并且cpu也将会支持全部类型,只是当我们的项目名称改变的时候,在我们引用加载so文件的地方也需要改变,不改变的话就出现找不到so库的异常,所以,这里配置只是为了便利系统生成我们制定的so文件名,而不是根据项目名称生成。
八 加载so库
在我们创建的Java2CJNI类中加载so库,主要是为了在我们调用本地方法之前先编译本地源码。
在使用 System.loadLibrary("Java2C");加载库时,库名一定要与在build.gradle中配置的moduleName 名称一致,否则将找不到库。
九 生成so文件
在项目的工具类中选择Build->Rebuild Project,进行重新编译工程,然后AS会为我们生成so文件,so文件所在目录为:NDKDemo\app\build\intermediates\ndk\debug\lib下
注意:so文件命名方式是:lib+moduleName+.so
十 执行调用本地方法
在MainActivity中点击Button按钮调用本地方法。并通过Toast打印出来。
OK,到这里已经完成了一个DEMO级别的NDK应用开发了,那么来看看我们的执行结果:
到这里一个DEMO级别的NDK开发已经完成了,通过上面的十步已经淋漓尽致的展现了NDK开发的所有步骤流程,相信你已经完全的学会啦。
下面章节将会讲述Java调用本地C方法和C回调Java方法的实例,也会穿插的讲解下JNI的更多使用,敬请期待。
更多资讯请关注微信平台,有博客更新会及时通知。爱学习爱技术。
Android NDK开发之从环境搭建到Demo级十步流的更多相关文章
- android studio1.0 for Mac环境搭建与demo运行(手动下载gradle,科学上google) 转载
http://blog.csdn.net/allenffl/article/details/41957907 官网下载 http://developer.android.com/sdk/install ...
- NDK开发-简介&环境搭建(Eclipse,Android Studio)
NDK简介 NDK(Native Development Kit)是一套工具集,允许你在Android应用中嵌入c或c++. 使用NDK的好处主要有以下4点: 安全:由于apk的java层代码很容易被 ...
- Android NDK 开发(一)--环境搭建【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分, ...
- android NDK开发环境搭建
android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...
- Windows下搭建Android NDK开发环境及命令行编译
首先说明本文内的相关安装操作参考<Pro Android C++ with the NDK>一书. 安装 Windows搭建Android NDK开发环境需要安装如下部分(同时需要配置对应 ...
- windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)
郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- Android NDK开发
Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...
- Android NDK 开发(二) -- 从Hlello World学起【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719 上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...
随机推荐
- swift -- 静态变量static
import UIKit class ViewController: UIViewController { //静态变量 swift中的static静态变量,只能在这里声明,不能在方法中声明 ...
- virtualBox,webstorm,开虚拟机传代码
一起git一个新技能 利用virtualBOX在本地开一个虚拟机,然后设置webstorm连接到虚拟机,将代码传到虚拟机里. 以下详细讲解: 第一步: 第二步:管理虚拟机的设置(我是用的是Xshell ...
- gitoschina使用入门
1 下载git sudo apt-get install git 2 添加公钥:terminal: ssh-keygen -t rsa -C "git.oschina.net" ...
- 无线同步模块SYN1000在电力监测相位测量领域的应用方案
在电力监测领域,出于安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信的应用系统,该如何来控制多个设备进行同步采样,以期提高相位角的测量精度,是一个不小的难题. 很多技术人员习惯性的采用无 ...
- @ModelAttribute--SpringMVC 注解系列文章(二)
概述 在日常的开发工作中,更新操作是经常会涉及到的一个功能,但是对于一条记录的更新,往往只会更新一部分的信息,而不会整条记录都更新,比如修改用户年龄的时候,用户密码是不需要修改的,针对这种情况,处理的 ...
- iOS开发之URLSession
1.概述 n NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的. n 当程序在前台时,NSURLSession与NSURLConnection大部分可以互 ...
- java与JSTL库
JSTL1. jstl的概述 * apache的东西,依赖EL * 使用jstl需要导入jstl1.2.jar * 四大库: > core:核心库,重点 > fmt:格式 ...
- JS——操作内容、操作相关元素
操作内容:普通元素.innerHTML = "值": 会把标记执行渲染普通元素.innerText = "值": 将值原封不动的展示出来,即使里面有标记 var ...
- Linux网络那点事
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 之前的之前说过网络自连接的配置(CentOS服务器网络配置:http://ww ...
- Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)
(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...