写在正文之前: 几个月没有更新博客,感觉有点生疏了,所以说不能断,一断人就懒。 其实这几个月也并不是什么事也没有做,俺可是时刻想着今年的任务呢,10本书,30篇博文...,这几个月间断性的也是在学习中,学H5,学设计模式,以及NDK JNI开发等等。 学习JNI主要是因为公司有一些COCOS游戏需要添加计费点,而又没有真正的游戏开发人员,这个重任就落到我身上了,然后就是各种虐,一虐到底,苦不堪言,这种虐并不是学习技术的虐,而是一款游戏用于N种计费点,不停的改改改,那个需求这个需要的,然后你就等着被玩吧。 正文 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开发呢?
当然还有其他的优点,这些都驱使我们选择相对来说高效和安全的DNK来开发我们的应用程序。 OK,说了那么多NDK,那到底怎么使用NDK来开发应用程序呢? 俗话说,工欲善其事必先利其器,想要使用NDK开发,必先打磨好工具。那下面首先来看看DNK的环境搭建吧。 NDK的环境搭建
OK,到这里我们基本的NDK环境配置已基本完成,那接下来就开始我们的NDK开发旅程吧。 Demo实例之调用本地无参方法直接返回字符串一 layout布局直接在layout中添加一个按钮Button控件,用于点击调用本地方法: 二 在MainActivity中获取该控件并注册它的点击监听器三 创建Java2CJNI类及本地方法在我们的包下直接创建一个Java2CJNI类,并在类里创建一个java2C的本地方法: 四 通过javah命令获取到本地头文件在项目根目录下,进入main->java目录,全选文件目录栏,直接输入cmd命令并按回车键进入docs命令,在命令中执行javah com.sanhui.ndkdemo.Java2CJNI命令: 执行完javah命令后,会在java当前目录下创建一个.h的头文件 五 在main目录下创建一个jni文件夹,并把(四)中的头文件转移到该文件夹下打开该文件夹可以看到系统为我们创建好的本地方法头文件。 六 创建实现头文件的.C源文件在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类型。 七 在该项目下的build.gradle配置生成的so名称和支持的cpu类型在android->defaultConfig下添加如下代码:
当然在这里不配置也是可以的,系统会用默认的项目名称作为so文件的名称,并且cpu也将会支持全部类型,只是当我们的项目名称改变的时候,在我们引用加载so文件的地方也需要改变,不改变的话就出现找不到so库的异常,所以,这里配置只是为了便利系统生成我们制定的so文件名,而不是根据项目名称生成。 八 加载so库在我们创建的Java2CJNI类中加载so库,主要是为了在我们调用本地方法之前先编译本地源码。 在使用 System.loadLibrary("Java2C");加载库时,库名一定要与在build.gradle中配置的moduleName 名称一致,否则将找不到库。 九 生成so文件在项目的工具类中选择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的更多使用,敬请期待。 更多资讯请关注微信平台,有博客更新会及时通知。爱学习爱技术。
|
|