文档章节

NDK开发,没有你想象的那么难

爱看博客
 爱看博客
发布于 2015/10/22 10:02
字数 1413
阅读 6
收藏 0
点赞 0
评论 0

NDK:Native Development Kit原生开发工具

NDK能干什么:NDK使得在android中,java可以调用C函数库。

为什么要用NDK:我们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信大家都清楚C与java的优劣。顺带提一下:NDK并不能显著提升应用效率。why?我们都觉得C语言比起java来说效率要高出很多,一方面,随着jdk的不断更新,java的效率也随之提高;另一方面,即便使用C语言编码提高了应用效率,但是在java与C相互调用时平白又增大了开销。

对于这些问题,这里就不多说了,希望详细了解的,请各位自行搜索。

NDK开发,第一步,当然是搭建环境

首先,去 http://developer.android.com/tools/sdk/ndk/index.html 下载你对应平台的开发工具

接着,我们需要实现linux环境 下载cygwin  http://www.cygwin.com/  (对于64位的用户,可以直接下载我已经下载好的,百度的链接应该比在线安装快一些,正在上传到我的网盘,稍后将地址放在回复里面)

选择在线下载的朋友,建议选择下图的地址,(是国内的)

选择好下载源以后就是选择下载目录了。我们用鼠标点开组件列表中的“Devel”分支,在该分支下,有很多组件,

我们必须的是:binutils,gcc,gcc-mingw,gdb

选好这四个目录了以后,就是漫长的等待了,可以去吃顿饭差不多了。

下面该配环境变量了:NDK环境变量需要将NDK根目录(其实就是ndk-builder.cmd文件的目录)加入系统环境变量

                                cygwin环境变量需要将bin目录加入系统环境变量

例如我的路径是:C:\java\android-ndk-r7b 和 C:\java\cygwin\bin 这两个

配置好环境后就可以开始编码了

1、新建一个android工程

2、在工程目录下添加名为 jni 的文件夹(必须)

3、在jni文件夹下新建你的.c文件(我的叫Hello.c)

4、在jni文件夹下新建名字为Android.mk文件

.mk文件中加入

?
1
2
3
4
5
LOCAL_PATH := $(call my-dir)     //当前路径(如果你了解shell语言,应该可以很轻松的理解)
include $(CLEAR_VARS)
LOCAL_MODULE    := Hello         //要生成的.so库名
LOCAL_SRC_FILES := Hello.c         //你的.c文件名字
include $(BUILD_SHARED_LIBRARY)

现在可以开始写我们的C代码了,当然这里不能再去从main函数开始写,而是有固定的命名方式

如图,我的函数名为:Java_com_example_testndk_MainActivity_helloWorldFromC     (Java_包名_类名_函数名)

呵呵,写C的朋友可能要抱怨了,我什么时候写过这么长的函数名了。没办法,这是jni的规范,以Java_开头,后跟java应用的包名加上类名,都是以下划线分割,最后才是跟我们的C函数名

至于参数形式以及返回值类型,我们可以去jdk目录下翻阅jni.h文件(我的jni文件目录:C:\java\jdk1.7.0_25\include\jni),有很多函数模板(不同于C++模板)

由于源码太多大家自己去查看吧,我就不贴图了

在jni.h文件的第104行这里可以看到我们返回的jstring本质上就是一个结构体指针,从C代码里面可以看到就是一个指向字符串的指针,在java里也就是一个数组。

好了,C代码讲解完毕,回到我们android工程。

从刚才的C代码函数名,大家应该就可以知道我的java类名了(这是必须的,因为要一一对应嘛)
需要注意的是图中红色方框中的静态代码块


学过java大家都知道,一个 类在初始化的时候最先执行的不是构造方法而是静态代码块,没错也就是这里之所以把System.loadLibrary()放到静态代码块的原因。从名字我们就可以猜到了,加载库(“Hello”)

还记得我们在Android.mk中声明的那个Hello吗,就是那里的名字

紧接着,看到第12行代码,回忆java知识了,用native修饰的方法,表示java的本地方法,也就是我们的C函数了。(其实这样的函数在android SDK)中并不少见,比如我们常用到的多媒体类MediaPlayer,大家可以去看看源码,这里我就不发了,里面有很多native方法,因为要调用音频驱动嘛。



至此,NDK工程就结束了,来测试一下吧。首先编译我们的C代码。打开cmd,切换到工程目录下(工程目录?右键工程名,properties,如上图)输入ndk-builder(当时的环境变量设置成功了吗?去看看安卓工程的libs文件夹里面是不是多出来了个libHello.so文件)
然后我们再运行我们的安卓工程吧。



最后,我再说一点自己的看法吧,首先就是C语言的基础,结构体指针一定要掌握的好,好好看看jni.h文件给出了哪些函数,其中还有支持C与java交互的函数,要想用好NDK,先用好JNI

版权声明:本文原创,转载请注明来自 http://kymjs.com/

本文转载自:http://blog.csdn.net/kymjs/article/details/40677329

共有 人打赏支持
爱看博客
粉丝 5
博文 103
码字总数 23887
作品 0
深圳

暂无相关文章

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 29分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 35分钟前 ⋅ 5

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部