JNI是什么?
JNI(全称Java Native Interface),是java与其他语言(主要是c/c++)交互的接口,是java的一种特性一种协议,开发者可以通过JNI在java中调用c/c++代码或在c/c++中调用java代码。
NDK是什么?
联系一个叫做JDK的东西,其实可以猜到个大概了,Android NDK(Native Development Kit ),是安卓的一个开发工具包。这里要注意一个是,JNI是java的技术,但是NDK是安卓自己的东西,跟java没关系。
可以这么说,JNI是最后想要达成的目的,即java与其他语言交互的目的,NDK是一个工具包,提供了实现这个目的的手段。
NDK官方文档中是这样描述的。
Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。 能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:
在平台之间移植其应用。
重复使用现有库,或者提供其自己的库供重复使用。
在某些情况下提高性能,特别是像游戏这种计算密集型应用。
为什么要用JNI和NDK开发,并且什么时候用它们呢?
一、是各种语言有自己的优点也有不足之处,比如,c/c++的效率是高于java的,在某个功能的性能十分重要的情况下,会考虑用c/c++来写那部分,然后再通过JNI调用。
二、也是为了让一些已经写好的c/c++库可以重用
三、并且c/c++编译后的代码更难被反编译,加密算法用c/c++来写更安全。
如果使用java与本地已编译的代码交互,通常会丧失平台可移植性。
怎么使用它们呢?
多数情况下我们会把c/c++语言编译成动态链接库(windows一般是dll文件,linux一般是so文件等,android是基于linux还记得吧,所以在android也是以so格式存在的),然后在android java源码中用System.loadLibrary(libname)或Runtime.getRuntime().loadLibrary(libname)这两个函数加载so库。
AS2.2以下实现步骤一般是(2.2以上的在新建项目的时候勾选c/c++ support就可以直接用修改app\src\main\cpp下的native-lib文件实现)
一、在java类中声明java native 方法
二、将该类编译成.class文件(用javac或者AS中直接run)
三、利用javah命令导出JIN头文件(.h文件)
四、用c/c++实现刚刚ava中声明的native方法,然后编译成.so文件、
五、调用运行java的native方法。
后面几篇开始会结合例子详讲NDK开发的具体应用例子。注意的是AS 2.2前后的区别,看看自己的版本跳转。
Android JNI'编程 与 NDK开发(二)AS 2.2以上NDK开发
下面贴一些JNI的基本知识和JNI之常用函数大全。(函数大全跳这个链接去H_bolin大神的博客里看就好)
Java基本数据类型对应的C语言基本数据类型
引用类型