一.什么是jni(what)
* JNI : Java Native Interface java本地接口,实现让java和本地语言c/c++之间的相互调用。jni是一种协议,提供的一套编程框架。
二.为什么使用jni(why)
* 1.操作底层硬件,android手机上的传感器
* 2.程序的运行效率高,2d3d加速,音视频的解码
* 3.程序的安全性
* 4.复用本地开源项目,SQLite,OpenSSL,OpenGL,OpenCV,FFmpeg
* 5.复用公司之前本地项目
三如何使用jni
## jni开发流程 ##
* 1.新建模块,native声明本地方法,调用本地方法
//native声明一个本地方法,具体是由c来实现
public native String helloFromC();
public void click(View view){
Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show();
}
* 2.在module的build.gradle中defaultConfig 内添加ndk,写法如下.
同步报错,点击setXXX 自动添加android.useDeprecatedNdk=true
defaultConfig {
applicationId "com.itheima.jnidemo"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "hello" //指定最终生成库名,最终生成的库文件名libhello.so
}
}
* 3.在调用本地方法的类中加载动态库,指定库名来加载
static {
System.loadLibrary("hello");//指定库名加载动态库
}
* 4.模块中new一个jni Folder文件夹,默认在main目录下
* 5.在jni文件夹下新建hello.c源文件,hello.h头文件(可选)
* 6.在hello.c源文件中按要求实现本地方法相应函数
#include "hello.h" //“”包含的头文件优先在当前目录下查找,如果没找到,再去系统头文件目录找
#include <jni.h> //提供java和c的基本类型及引用类型对应,声明数据转换方法
/**
* 本地方法相应的函数名:Java_包名_类名_本地方法名
* 参数1 JNIEnv *env jni环境,调用转换数据方法
* 参数2 jobject obj 调用本地方法类的对象
*/
jstring Java_com_itheima_jnidemo_MainActivity_helloFromC(JNIEnv *env, jobject obj){
char buf[] = "hello from c!";
//env : JNIEnv * <=> struct JNINativeInterface* *
//JNIEnv : struct JNINativeInterface*
//jstring (*NewStringUTF)(JNIEnv*, const char*);
return (*env)->NewStringUTF(env, buf);
}
* 7.gradle同步,make module
* 8.运行应用程序
## javah生成本地方法相应函数声明 ##
* 在main/java文件夹和com的同层目录中执行
D:\jni02\code\JniDemo\calc\src\main\java>javah -classpath . -d ../jni com.itheima.calc.MainActivity
源码下载