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

摘要:
java是半解释型语言,非常easy被反汇编后拿到源码文件,在开发一些重要协议时。一方面,随着jdk的不断更新,java的效率也随之提高;还有一方面。NDK开发,第一步。在该分支下,有非常多组件。没办法,这是jni的规范。后跟java应用的包名加上类名。至此,NDKproject就结束了,来測试一下吧。首先就是C语言的基础,结构体指针一定要掌握的好。当中还有支持C与java交互的函数。

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位的用户。能够直接下载我已经下载好的,百度的链接应该比在线安装快一些,正在上传到我的网盘。稍后将地址放在回复里面)

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

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

选择好下载源以后就是选择下载文件夹了。

我们用鼠标点开组件列表中的“Devel”分支。在该分支下,有非常多组件。

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

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

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

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

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

选好这四个文件夹了以后,就是漫长的等待了。能够去吃顿饭几乎相同了。

以下该配环境变量了:NDK环境变量须要将NDK根文件夹(事实上就是ndk-builder.cmd文件的文件夹)增加系统环境变量

cygwin环境变量须要将bin文件夹增加系统环境变量

比如我的路径是:C:javaandroid-ndk-r7b 和 C:javacygwinin 这两个

配置好环境后就能够開始编码了

1、新建一个androidproject

2、在project文件夹下加入名为 jni 的文件夹(必须)

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

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

.mk文件里增加

1
2
3
4
5
LOCAL_PATH:=$(callmy-dir)//当前路径(假设你了解shell语言,应该能够非常轻松的理解)
include$(CLEAR_VARS)
LOCAL_MODULE:=Hello//要生成的.so库名
LOCAL_SRC_FILES:=Hello.c//你的.c文件名称字
include$(BUILD_SHARED_LIBRARY)

如今能够開始写我们的C代码了。当然这里不能再去从main函数開始写,而是有固定的命名方式

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

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

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

至于參数形式以及返回值类型。我们能够去jdk文件夹下翻阅jni.h文件(我的jni文件文件夹:C:javajdk1.7.0_25includejni),有非常多函数模板(不同于C++模板)

因为源代码太多大家自己去查看吧。我就不贴图了

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

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

好了,C代码解说完成,回到我们androidproject。

从刚才的C代码函数名,大家应该就能够知道我的java类名了(这是必须的,由于要一一相应嘛)
须要注意的是图中红色方框中的静态代码块
NDK开发,没有你想象的那么难第8张

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

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

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


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

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

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

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

免责声明:文章转载自《NDK开发,没有你想象的那么难》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在线流程图制作工具loki 数据库详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

matlab环境配置

一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录atlas_Athlon.dll.路径是相对的,根据的安装的路径来设置变量的值,如默认安装于C盘则设为C:MATLAB7inwin32atlas_Athlon.dll. atl...

Hadoop 部署之 Spark (六)

目录 一、Spark 是什么 二、Scala的安装(所有节点) 三、Spark 安装(所有节点) 1、下载安装 2、配置 Spark 环境变量 四、Spark 配置(namenode01) 1、配置 spark-env.sh 2、配置 slaves 3、配置文件同步到其他节点 4、启动 Spark 集群 五、检查 1、JPS 2、Spa...

Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解

作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位。那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能。然而这个时候各种各样的问题也就来了,之前网上一直有零零碎碎的移植教程,但是都不完整,或是有这样或者那样的问题。今天刚刚研究成功了Cocos2dx-3.0版本项目的安卓平台移植...

windows环境变量PATH顺序的重要性

  PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径。不同的路径之间,用英文的分号间隔开。系统在执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行程序文件(windows环境变量的查找顺序是按照文件的录入顺序从前往后寻找的,最前面一条的优先...

navicat和 plsql 连接oracle数据库 总结

打开 navicat  -->工具-->选项-->oci   右侧选择oci.dll 的路径 默认 在 navicat的安装目录下有一个 instantclient 的文件夹 直接选择这个里面的 oci.ll 就可以了 我的 navicat 是 11.1.10 64-bit   instantclient 是 instantclient_...

X 利用ogg实现oracle到kafka的增量数据实时同步

利用ogg实现oracle到kafka的增量数据实时同步 前言 https://dongkelun.com/2018/05/23/oggOracle2Kafka/ ogg即Oracle GoldenGate是Oracle的同步工具,本文讲如何配置ogg以实现Oracle数据库增量数据实时同步到kafka中,其中同步消息格式为json。下面是我的源端和目标...