一、什么是JNI?
Java Native Interface java本地接口
提供了java与其他语言的通信接口,主要是Android中的c和c++,方便调用底层的一些功能强大的方法
一句话总结就是,java代码调用c和c++代码。
二、为什么使用JNI?
1.效率
java代码跨平台,虚拟机解释执行,不能执行操作硬件,虽然现在有了art模式,但是art模式安装应
用体积会变大
C代码直接操作硬件,效率高,而且我们可以自己手动释放内存
2.优秀C和C++代码
c和c++发展已经有好几十年,已经有了很多优秀的框架,比如ffmpeg-多媒体播放器;opencv-图形识
别;7-zip压缩,这些都已经成形,可以直接用,不必要用java重新造轮子
3.应用场景
智能家居,车载电脑等等都需要我们来直接操作硬件
4.特殊业务逻辑
c和c++反编译困难,调试困难,java代码反编译简单,容易看懂;为了提高代码的安全性,可以用c
和c++来开发一些比较重要的业务逻辑
三、开发流程
一般用ndk开发工具,工具可以在网上下载,工具使用可以参考ndk中docs文档,非常详尽
流程:
1.java中声明native方法
public native String helloFromC();
2.as中main目录下创建jni目录
3.编写c代码,jni目录下创建.c文件,
jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
char* str = "hello from c !!";
//在jni规范里面 在jni环境的结构体里面
//jstring (*NewStringUTF)(JNIEnv*, const char*);
//转化成了java的字符串
return (*(*env)).NewStringUTF(env,str);
}
//Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)
4.配置Android.mk文件,添加jni.h文件(ndk目录中有,选择适合自己的)
#指定编译的文件夹 指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE := hello
# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c
#编译一个动态库,静态库
#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)
5.执行ndk-build.cmd编译c代码,生成动态库.so
6.在java中把动态链接库加到jvm虚拟机
static{
System.loadLibrary("库文件名称不带前缀,后缀名");
}
库文件名就是步骤4中的LOCAL_MODULE对应的名称
7.像调用java一样调用native方法
小结:一步一个脚印,慢慢学习