一、Android JNI简介
JNI(Java Native Interface)提供了若干的API实现了Java与其他语言的通信(主要是C和C++)。从Java1.1开始,JNI标准成为Java平台的一部分,允许Java与其他语言进行交互。由于JNI是本地编程接口,通常为了与硬件、操作系统交互,或者为了提高程序的性能,在JVM内部运行Java代码使得能够和其他的语言进行交互,但也会丧失平台的可移植性。
二、JNI优缺点
1.优点:
(1)性能得到较大的提高
(2)效率高
(3)使用方便
(4)本地代码,为Java与C/C++/汇编建立了一个桥梁
2.缺点:
(1)丧失可移植性
(2)安全性降低
(3)耦合性下降
三、JNI使用场景
1.JAVA程序和本地程序使用TCP/IP或者IPC进行交互。
2.当用JAVA程序连接本地数据库时,使用JDBC提供的API。
3.JAVA程序可以使用分布式对象技术,如JAVA IDL API。
这些方案的共同点是Java与C处于不同线程,或者不同的机器上。这样的做法好处在于,当本地程序崩溃时,不会影响到Java程序。
下面这些场景中,同一进程内JNI的使用无法避免:
1.程序当中用到了JAVAAPI不提供的特殊系统环境才会有的特征。而跨进程操作又不现实。
2.你可能想访问一些己有的本地库,但又不想付出跨进程调用时的代价,如效率,内存,数据传递方面。
3.JAVA程序当中的一部分代码对效率要求非常高,如算法计算,图形渲染等。
四、JNI与NDK的关系
JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。
NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
五、下载、配置NDK
在AndroidStudio2.0以后,Android Studio自带NDK插件,不需要另外下载NDK再进行配置,开发工具均已配置好。
下载地址:http://www.androiddevtools.cn/
1.新建Project,选择Includec++ Support选项,创建空白Activity,直至Finish,创建成功。
2.自动生成cpp文件夹和native-lib.cpp文件,不需另外启用终端生成,开发工具均已自动完成。
3.在local.properties下配置NDK关联,关联地址不统一。
ndk.dir=D\:\\software\\android\\android-sdk\\ndk-bundle
sdk.dir=D\:\\software\\android\\android-sdk
六、开发步骤
1.在MainActivity中添加关联native-lib.cpp中的方法。
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native int stringFromJNI(int i, int j);
2.在native-lib.cpp中实现C/C++/汇编代码,构造方法。
#include <jni.h>
#include <string>
extern "C"
int
Java_com_example_jnidemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject obj, int i, int j /* this */) {
// std::string hello = "Hello from C++";
// return env->NewStringUTF(result.c_str());
int y = i * j;
return y;
}
3.Activity中进行调用方法。
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
String mStrResult = "1 * 3 = " + stringFromJNI(1, 3);
tv.setText(mStrResult);
七、实现效果图
八、源码下载
下载地址:http://download.csdn.net/detail/u012721519/9769975
Good luck!
Write by Jimmy.li