当前位置: 首页 > 科技观察

AndroidNDK开发没有你想的那么难

时间:2023-03-12 16:17:56 科技观察

DK:NativeDevelopmentKit原生开发工具NDK能做什么:NDK让java调用android中的C函数库。为什么要用NDK:我们都知道java是半解释型语言,反汇编后很容易得到源代码文件。在开发一些重要的协议时,为了安全起见,我们使用C语言来编写这些重要的部分。以增加系统安全性。还有就是在一些接近硬件的环境下,相信大家都知道C和java的优缺点。顺便说一句:NDK并没有显着提高应用程序的效率。为什么?我们都觉得C语言比java效率高很多。一方面,随着jdk的不断更新,java的效率也随之提高;当java和C相互调用时,只是增加了开销。对于这些问题,这里就不多说了。如果您想了解更多,请自行搜索。NDK开发,第一步当然是搭建环境。首先,到http://developer.android.com/tools/sdk/ndk/index.html下载对应平台的开发工具。接下来我们需要实现linux环境下载cygwinhttp://developer.android.com/tools/sdk/ndk/index.html://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文件中加入LOCAL_PATH:=$(callmy-dir)//当前路径(如果懂shell语言应该很容易理解)包括$(CLEAR_VARS)LOCAL_MODULE:=Hello//.solibrarytobegeneratedLOCAL_SRC_FILES:=Hello.c//Thenameofyour.cfileinclude$(BUILD_SHARED_LIBRARY)现在我们可以开始写我们的C代码了。当然,我们可以不再从main函数开始写,而是有固定的命名方式,如图所示。我的函数名是:Java_com_example_testndk_MainActivity_helloWorldFromC(Java_package_name_className_functionname)呵呵,写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函数。(其实这样的函数在androidSDK中并不少见)。比如我们经常使用的多媒体类MediaPlayer。你可以去看看源代码。我不会在这里发布。里面有很多native方法,因为需要调用音频驱动。至此,NDK项目就结束了,我们来测试一下。首先编译我们的C代码。打开cmd,切换到项目目录(项目目录?右击项目名称,属性,如上图),输入ndk-builder(这时候是不是环境变量设置成功了?去看看里面还有没有Android项目libHello.so文件的libs文件夹)然后我们运行我们的Android项目。最后说说我自己的看法。首先,它是C语言的基础。结构指针一定要掌握好。好好看看jni.h文件中给出的函数,包括支持C和java交互的函数。要想用好NDK,必先用好JNI