NDK:Native Development Kit原生开发工具

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

为什么要用NDK:我们都知道。java是半解释型语言,非常easy被反汇编后拿到源码文件,在开发一些重要协议时。我们为了安全起见,使用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、新建一个androidproject

2、在project文件夹下加入名为 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代码解说完成,回到我们androidproject。

从刚才的C代码函数名,大家应该就能够知道我的java类名了(这是必须的,由于要一一相应嘛)

须要注意的是图中红色方框中的静态代码块

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

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

紧接着,看到第12行代码。回顾java知识了,用native修饰的方法,表示java的本地方法,也就是我们的C函数了。(事实上这种函数在android SDK)中并不少见,比方我们经常使用到的多媒体类MediaPlayer,大家能够去看看源代码。这里我就不发了,里面有非常多native方法。由于要调用音频驱动嘛。

至此,NDKproject就结束了,来測试一下吧。

首先编译我们的C代码。打开cmd,切换到project文件夹下(project文件夹?右键project名,properties,如上图)输入ndk-builder(当时的设置环境变量成功了吗?去看看安卓project的libs文件夹里面是不是多出来了个libHello.so文件)


然后我们再执行我们的安卓project吧。

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

NDK开发,没有你想象的那么难的更多相关文章

  1. QQ的成功,远没有你想象的那么顺利和轻松

    本文来自公众号“傅老师”(ID:fustory)的原创分享,感谢作者. 1.引言 如果QQ是一个人,看似风光,其实从出生到成长,过程饱经错荡,堪算坎坷.它的人生历程确实也够励志的了.   学习交流: ...

  2. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  3. Android NDK 开发(一)--环境搭建【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分, ...

  4. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

  5. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  6. JNI/NDK开发

    公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...

  7. NDK开发_笔记0

    自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...

  8. Android SDK NDK开发总结

    描述:http://talent.baidu.com/external/baidu/index.html#/jobDetail/2/1237247043 android studio实现Jni(C/C ...

  9. Android NDK开发Hello Word!

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

随机推荐

  1. 17Web服务器端控件

    Web服务器端控件 Web服务器端控件 ASP.Net提供了两类服务器端控件:Html服务器端控件和Web服务器端控件.由于Web服务器端控件功能更强大,和Windows应用程序的控件使用方法类似,容 ...

  2. JavaSE-10 多态

    学习要点 多态的优势和应用场合 父类和子类之间的类型转换 instanceof运算符的使用 父类作为方法形参实现多态 父类作为返回值实现多态 使用多态的原因 需求描述: 在宠物管理系统中,宠物饿了,需 ...

  3. B4. Concurrent JVM 锁机制(synchronized)

    [概述] JVM 通过 synchronized 关键字提供锁,用于在线程同步中保证线程安全. [synchronized 实现原理] synchronized 可以用于代码块或者方法中,产生同步代码 ...

  4. 奇异值分解 SVD 的数学解释

    奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解(Matrix Decomposition)的方法.除此之外,矩阵分解还有很多方法,例如特征分解(Eigen ...

  5. 数据库的ACID 简谈

    一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. 二.ACI ...

  6. [Python3网络爬虫开发实战] 1.2.6-aiohttp的安装

    之前介绍的Requests库是一个阻塞式HTTP请求库,当我们发出一个请求后,程序会一直等待服务器响应,直到得到响应后,程序才会进行下一步处理.其实,这个过程比较耗费资源.如果程序可以在这个等待过程中 ...

  7. oracle dmp文件的导入导出

    一.命令行方式 exp 用户名/密码@库名 file=文件位置.dmp owner=用户名 imp 用户名/密码@库名 file=文件位置.dmp 注意 : 导入过程若有的表已经存在可能会报错,可以全 ...

  8. nginx配置文件+本地测试请求转发到远程服务器+集群

    1 在本地测试1 众所周知,nginx是一个反向代理的服务器,主要功能即为实现负载均衡和动静分离.在别的我别的文章有详细的nginx(Windows)相关介绍教程. 由于自己安装的nginx在本地的计 ...

  9. Django之CBV和FBV

    Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...

  10. odoo权限配置讲解2

    今天我们在来讲解一下odoo中配合使用公司开发的权限配置模块,简单配置odoo权限的操作说明 接着上篇讲到的,昨天我们只是做了一个简单的表单模型的筛选规则 今天来讲解一下如何在创建内贸报价单的时候,在 ...