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

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

时间: 2024-10-24 18:11:05

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

Android JNI/NDK开发(一)NDK真的很难吗?

少壮不努力,老大徒伤悲.大学时光的潇洒散漫导致今天连C/C++编程都不会.作为一个程序员,不会C/C++说出去简直丢人啊.最近浏览公司招聘信息(Android职位),发现对NDK开发的要求越来越普遍了.笔者学习的是java,从事Android开发,对于Android底层的东西多少有点畏惧,因为没有涉及过,但是我们知道,不能因为怕就放弃.如我曾经签名所言:现在开始行动,就比还在犹豫的人快了一步. 回到正题,NDK开发真的很难吗?其实不是的,觉得难是因为你没懂,不懂是因为没学.那就来吧 NDK:什么

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

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错

Android NDK开发(一)——环境搭建

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分,通过Google提供的NDK套件,我们可以使用JNI这座桥梁在Java和C/C++之间建立联系(互相调用).那么,为什么在Android开发中需要了解NDK开发呢?诚然,这些原因有很多说法,在我总结来是这样的.C/C++是比Java还要古老的编程语言,由于其古老的特性,导致早期有很多优秀的类库出现,

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

转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成so动态库文件,并提供Java接口供应用层调用,这么做的目的主要就是为了提供应用的安全性,防止被反编译后被不法分子分析应用的逻辑.当然打包成so也不能说完全安全了,只是相对反编译Jav

老码农谈NDK开发

关于NDK,我也天真过 5.6年前刚拿到HTC的G1开始做Android开发时,得知Java可以和C混编激动不已,真的是拿到钥匙见什么都是锁,老想着用NDK做些事情.到后来公司做了一个带有强烈技术风格的业务决策,我被迫把NDK来回折腾了很长时间,也没能折腾出什么成果,但这个决策却把公司折腾完蛋,我也就对NDK渐渐心恢意冷了,真正体会到,做业务,服务用户为主,技术上,好用是王道. 今天收到一封邮件(来自:[email protected]),让我谈谈NDK,真的挠到了我的痒处,一直有些话是想跟对N

Android NDK开发(三)——常见错误集锦以及LOG使用

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错

NDK开发中问题

1.前期ndk开发主要是在开源项目中复用项目的makefile等,就需要修改指定CC或C++编译链:具体情况还依赖于工程的config文件: 对于简单项目,则可以直接编写Android.mk;例如引入的GTest与GMock;重新创建Android.mk,利用ndk-build生成.a文件,一同引入新ndk工程即可:另外吐槽下Gmock;对于mock函数还需要继承类,比linux上的mock难用多了:另外Gtest 也不支持静态对象的判断,对于函数内赋值,不能指望全局对象,只能判断输出参数或者返

Android NDK开发环境搭建

目录[-] 一.下载NDK开发包,并解压. 二.下载Cygwin,安装所需库. 三.将NDK添加到Cygwin的build配置中. 四.安装CDT. ? 1 2 3 4 5 /* http://my.oschina.net/lifj/blog/176916 */ 有人说,网上的环境配置一大堆,你还写做什么?一来,是我再次复习的材料.二来,网上有些地方说的不是很详细,我也是参考了好多资料,弄了半天才弄好环境.写下来,帮助后面的人省掉不必要的麻烦.下面进入正题. 作为一个2年的android攻城狮,

NDK开发,如何配置 debug环境

刚开始做NDK 开发的时候,Android Studio 还没提供了 native C/C++ 设置断点 调试,我们都是通过输出 日志来调试,这样费时耗力.Android Studio 应该是在 2.2 版本才提供的设置断点 debug 功能,同时在该版本也提供了 cmake 编译.     我目前在做 NDK 开发的时候,还是习惯用 NDK-Build(也就是设置 Android.mk) 来开发,我先简单说一下怎么用输出日志来调试: 1.首先在 Android.mk 设置MODULE 添加日志