写在正文之前:
几个月没有更新博客,感觉有点生疏了,所以说不能断,一断人就懒。
其实这几个月也并不是什么事也没有做,俺可是时刻想着今年的任务呢,10 本书,30 篇博文...,这几个月间断性的也是在学习中,学 H5,学设计模式,以及 NDK JNI 开发等等。
学习 JNI 主要是因为公司有一些 COCOS 游戏需要添加计费点,而又没有真正的游戏开发人员,这个重任就落到我身上了,然后就是各种虐,一虐到底,苦不堪言,这种虐并不是学习技术的虐,而是一款游戏用于 N 种计费点,不停的改改改,那个需求这个需要的,然后你就等着被玩吧。
正文
OK,言归正传,说到 NDK,相信大家都不陌生,它是 Google 为便于 Android 开发提供的一种原生开发集:Native Development Kit,而且也是一个包含 API、构建工具、交叉编译、调试器、文档示例等一系列的工具集,可以帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 APK。
与 DNK 密切相关的另一个词汇则是 JNI,它是 DNK 开发中的枢纽,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 的环境搭建吧。
OK,到这里我们基本的 DNK 环境配置已基本完成,那接下来就开始我们的 DNK 开发旅程吧。
直接在 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 的更多使用,敬请期待。
更多资讯请关注微信平台,有博客更新会及时通知。爱学习爱技术。
来源: http://www.cnblogs.com/guanmanman/p/6769240.html