写在正文以前:java
几个月没有更新博客,感受有点生疏了,因此说不能断,一断人就懒。python
其实这几个月也并非什么事也没有作,俺但是时刻想着今年的任务呢,10本书,30篇博文...,这几个月间断性的也是在学习中,学H5,学设计模式,以及NDK JNI开发等等。android
学习JNI主要是由于公司有一些COCOS游戏须要添加计费点,而又没有真正的游戏开发人员,这个重任就落到我身上了,而后就是各类虐,一虐到底,苦不堪言,这种虐并非学习技术的虐,而是一款游戏用于N种计费点,不停的改改改,那个需求这个须要的,而后你就等着被玩吧。c++
正文windows
OK,言归正传,说到NDK,相信你们都不陌生,它是Google为便于Android开发提供的一种原生开发集:Native Development Kit,并且也是一个包含API、构建工具、交叉编译、调试器、文档示例等一系列的工具集,能够帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一块儿打包成APK。设计模式
与NDK密切相关的另外一个词汇则是JNI,它是NDK开发中的枢纽,Java与底层交互绝大多数都是经过它来完成的,那么接下来看看什么是JNI?安全
JNI:Java Native Interface 也就是java本地接口,它是一个协议,这个协议用来沟通java代码和本地代码(c/c++)。经过这个协议,Java类的某些方法可使用原生实现,同时让它们能够像普通的Java方法同样被调用和使用,而原生方法也可使用Java对象,调用和使用Java方法。也就是说,使用JNI这种协议能够实现:java代码调用c/c++代码,而c/c++代码也能够调用java代码。微信
那为何要使用NDK开发呢?app
咱们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,咱们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。工具
在一些复杂性的计算中,要求高性能的场景中,C/C++更加的有效率,代码也更便于复用。
固然还有其余的优势,这些都驱使咱们选择相对来讲高效和安全的DNK来开发咱们的应用程序。
OK,说了那么多NDK,那到底怎么使用NDK来开发应用程序呢?
俗话说,工欲善其事必先利其器,想要使用NDK开发,必先打磨好工具。那下面首先来看看DNK的环境搭建吧。
安装配置NDK
首先下载NDK,这里我使用的是android-ndk-r14b-windows-x86_64,能够自主选择。
1). 解压NDK的zip包,注意路径目录不要出现空格和中文,这里建议你们把包解压到SDK目录里面,并命名为ndk-bundle,好处是,启动AS的时候会检查它并直接添加到ndk.dir中,减小咱们的配置工做;
2). 配置path : 把解压好的路径添加到环境变量path中;
3).ndk-build:cd到解压后NDK的根目录,执行ndk-build命令。
给AS配置关联NDK,这里我使用的是androidstudio,使用Eclipse的会有所不一样,请自行查找资料来配置。
1). 在创建的工程中的local.properties中添加以下配置
ndk.dir=D:\guanmanman\androidStudio\sdk\ndk-bundle,这里注意下要使用转义字符“”来进行字符转义。若是ndk目录是存放在SDK中,并命名为ndk-bundle,这个配置会自动为添加上去。
2). 在工程中gradle.properties中添加对旧版本的NDK支持的配置
android.useDeprecatedNdk=true
OK,到这里咱们基本的NDK环境配置已基本完成,那接下来就开始咱们的NDK开发旅程吧。
直接在layout中添加一个按钮Button控件,用于点击调用本地方法:
在咱们的包下直接建立一个Java2CJNI类,并在类里建立一个java2C的本地方法:
在项目根目录下,进入main->java目录,全选文件目录栏,直接输入cmd命令并按回车键进入docs命令,在命令中执行javah com.sanhui.ndkdemo.Java2CJNI命令:
执行完javah命令后,会在java当前目录下建立一个.h的头文件
打开该文件夹能够看到系统为咱们建立好的本地方法头文件。
在jni目录下建立一个Java2C.c的源文件,经过#include引入咱们的头文件com_sanhui_ndkdemo_Java2CJNI.h,并把在头文件下的声明方法JNIEXPORT jstring JNICALL Java_com_sanhui_ndkdemo_Java2CJNI_java2C(JNIEnv *, jobject);复制到咱们的Java2C.c中,补全方法参数,并实现一个C字符串“I am From Native C .”的返回:
OK,至此咱们的代码已编写完毕,接下来咱们须要配置编译后的so名称和支持的cpu类型。
在android->defaultConfig下添加以下代码:
ndk{ moduleName "Java2C" //so文件名 abiFilters "armeabi", "armeabi-v7a", "x86" //CPU类型 }
固然在这里不配置也是能够的,系统会用默认的项目名称做为so文件的名称,而且cpu也将会支持所有类型,只是当咱们的项目名称改变的时候,在咱们引用加载so文件的地方也须要改变,不改变的话就出现找不到so库的异常,因此,这里配置只是为了便利系统生成咱们制定的so文件名,而不是根据项目名称生成。
在咱们建立的Java2CJNI类中加载so库,主要是为了在咱们调用本地方法以前先编译本地源码。
在使用 System.loadLibrary("Java2C");加载库时,库名必定要与在build.gradle中配置的moduleName 名称一致,不然将找不到库。
在项目的工具类中选择Build->Rebuild Project,进行从新编译工程,而后AS会为咱们生成so文件,so文件所在目录为:NDKDemo\app\build\intermediates\ndk\debug\lib下
注意:so文件命名方式是:lib+moduleName+.so
在MainActivity中点击Button按钮调用本地方法。并经过Toast打印出来。
OK,到这里已经完成了一个DEMO级别的NDK应用开发了,那么来看看咱们的执行结果:
到这里一个DEMO级别的NDK开发已经完成了,经过上面的十步已经淋漓尽致的展示了NDK开发的全部步骤流程,相信你已经彻底的学会啦。
下面章节将会讲述Java调用本地C方法和C回调Java方法的实例,也会穿插的讲解下JNI的更多使用,敬请期待。
更多资讯请关注微信平台,有博客更新会及时通知。爱学习爱技术。