初识JNI

需要用到NDK

  Android 平台从诞生起,就已经支持 C、C++开发。众所周知,Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使用 Java 语言。但这并不等同于“第三方应用只能使用 Java”。在 Android SDK 首次发布时,Google 就宣称其虚拟机 Dalvik 支持 JNI 编程方式,也就是第三
方应用完全可以通过 JNI 调用自己的 C 动态库,即在 Android 平台上,“Java+C”的编程方式是一直都可以实现的。不过,Google 也表示,使用原生 SDK 编程相比 Dalvik 虚拟机也有一些劣势,Android SDK 文档里,找不到任何 JNI 方面的帮助。即使第三方应用开发者使用 JNI 完成了自己的 C 动态链接库(so)开发,但是 so 如何和应用程序一起打包成 apk 并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问 Framework API,Debug 难度更大等。开发者需要自行斟酌使用。
于是 NDK 就应运而生了。NDK 全称是 Native Development Kit。
            NDK 的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK 将是 Android 平。

NDK 的安装
1.NDK 的下载
           NDK 的官方下载地址 http://developer.android.com/tools/sdk/ndk/index.html,由于官方网址在国外,国内访问不了,必须得FQ。因此我提供了下载好的 NDK 工具放在百度网盘上供大家下载。http://pan.baidu.com/s/1jGpCDKi

2.NDK 解压到一个不包含空格和中文的目录下
本人将 NDK 解压在D:\soft\Android\android-ndk-r9b-windows-x86 中

NDK 目录结构说明

build:该目录存放的使用 NDK 的 mk 脚本,mk 脚本指定了编译参数

docs:该目录存放的是 NDK 的使用帮助文档

platforms:这里面存放的是与各个 Android 版本相关的平台(x86,arm,mips)相关 C 语言库和头文件

prebuilt:预编译工作目录

samples:存放的是演示程序

sources:存放的是 NDK 工具链的 C 语言源码

tests:测试相关的文件

toolchains:工具链,存放了三种架构的静态库等文件ndk-build.cmd:Window 平台使用 NDK 的命令

ndk-build:Linux 平台使用 NDK 的命令

JNI使用

1、         创建一个新的 Android 工程《JNI 入门》 ,工程的最终目录结构如下图所示

 

2、         在 MainActivity.java 类中定义一个 native 方法

 

定义一个 native 方法,意思是该方法的具体实现交给 C 语言实现

3、         在工程跟目录下创建一个文件夹 jni,该目录名称是约定(约定优于配置)好的,不能是其他名字。

 

4、         在 jni 目录下创建 hello.c 源文件, 文件名可以按照见名知意的规则来创建。 hello.c 代码清单如下:

 

5、         将jni.h文件和Android.mk文件以及Application.mk文件拷贝到jni文件夹下,怎么拷贝:从下载的ndk里找,找不到mk文件自己创建也可以。

 

Android.mk内容如下:

 

Application.mk内容如下:

 

该清单其实只有一行内容, 第一行是注释。 APP_ABI 参数指定要生成的目标文件支持的平台都有哪些,默认是 armeabi 如果想支持多个平台只需要空一格然后写出其他平台名字即可。

6、         在 cmd 中,将当前目录切换到 hello.c 所在目录,然后重新执行 ndk-build.cmd 命令,这次成功编译,cmd 显示效果如下图所示:

 

执行完成后刷新libs会多出两个so动态库。

 

查看项目目录结构,发现在 libs 目录中多了两个文件夹 armeabi 和 x86,这两个文件夹下分别包含了一个 libhello.so 动态链接库。这也代表着当前工程中的动态库支持 arm 架构和 x86 架构的 cpu。

7、         MainActivity.java 中调用 C 语言

 

在active_main.xml中添加代码如下:

 

8、         运行结果:

 

 

 

JNI 数据类型和数据结构

 

 

posted @ 2016-06-03 14:50  winfu  阅读(288)  评论(4编辑  收藏  举报