目录
JNI
1、JNI概述、作用
简介JNI的概念和作用,解释JVM保证java代码能够跨平台兼容的原因,jni动态库的加载流程,简介了jni函数的注册方法(静态注册的劣势,动态注册的方法)
简介JNI实现Java调用到native语言的主要流程;JNI函数声明中各部分内容的介绍和作用;不同平台上动态链接库类型;简单的Java代码示例实现JNI调用,包括javac指令生成JNI头文件,gcc环境安装搭建,动态库生成等。
JNI的适用场景、NDK、动态库和静态库
JNI基础简介
那什么场景下可能会用到JNI呢?
1、需要提升性能时,比如说做一些底层的开发,例如音视频处理之类的,通常都会用到JNI。
2、增加破解难度,例如需要提升代码的保护级别,需要将一些敏感信息放到底层隐藏起来。
3、需要使用到一些较为成熟的底层C/C++库时。
NDK:Native Development Kit
要在安卓上使用JNI就需要用到NDK,NDK是一系列工具的集合,它提供了一系列的工具,帮助开发者快速使用C/C++代码,能够交叉编译生成可在安卓系统上运行的动态库或者静态库。例如我们想要将基于C的音视频处理库FFmpeg移植到安卓平台上使用的话就需要用到NDK进行交叉编译。
动态库、静态库:
静态库:静态库是指在链接阶段,编译器将汇编生成的.o目标文件与库文件一起链接打包到可执行文件中,或者说一起链接生成最后的可执行文件。因此对应的链接方式称为静态链接。
因为静态库是在编译期间连接库文件的,所以静态库存在着可执行文件体积较大,更新维护不方便 等问题。
动态库:动态库又叫共享库,或动态链接库。动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,不同的应用程序如果要调用同一个库,在内存中只需要有一份该共享库即可,这样就规避了空间浪费的问题。而且动态库是在程序运行时才被载入,所以相对静态库来说动态库还具有更新、部署方便等优点。
正因为动态库的这些优点,所以目前的大多数的SDK普遍采用动态库的方式。
JNI函数:
JNI函数声明中各部分的介绍和作用。
2、静态注册、动态注册
静态注册的劣势?
动态注册的时机?动态注册其实就是在java层加载JNI动态库的时候,调用大JNI_OnLoad函数,需要在该函数中将JNI函数指针注册到JVM中。
静态JNI方法和实例JNI方法的区别?区别在第二个参数,普通的JNI方法对应的JNI函数的第二个参数是jobject类型,而静态的JNI方法对应的JNI函数的第二个参数是jclass类型
JNIEnv的认识:和线程有一一对应关系。
如何在JNI函数中通过JNIEnv操作jobject,常见的函数有哪些类别?
jstring和C++字符串之间的转换?
JNI函数签名的规范?
JNI中对象的垃圾回收机制?三种引用方式?
如何实现JNI调用Java函数呢?必须先使用JVM对象(在JNI_OnLoad中传入,所有native线程仅此一份),将当前线程和JVM对象绑定,获得当前线程的JNIEnv,然后调用JNIEnv相关接口完成调用。
Android JNI知识点总结
主要解释JNIEnv和JVM关系,JNI调用流程,动态注册、静态注册方法,数据类型转换。
JNIEXPORT关键字作用:JNIEXPORT 这个关键字说明这个函数是一个可导出函数,C/C++ 库里面的函数有些可以直接被外部调用,有些不可以,原因就是每一个C/C++库都有一个导出函数列表,只有在这个列表里面的函数才可以被外部直接调用,类似Java的public函数和private函数的区别。 JNI层必须实现为动态库的形式,这样Java虚拟机才能加载它并调用它的函数。
JNICALL作用:说明这个函数是一个JNI函数,用来和普通的C/C++函数进行区别,实际发现不加这个关键字,Java也是可以调用这个JNI函数的。
3、数据转换、函数签名
为什么需要设计函数签名?Java语言有函数重载,仅依赖函数名无法确定唯一的JNI函数。
JNI函数签名的规范?