1.JNI层连同了Java世界和Native世界
2.Java<-->JNI<-->Native
exp:MediaScanner<-->libmedia_jni.so<-->libmedia.so
库名没有规定的命名规则
JNI层必须实现为动态库的形式,这样java虚拟机才能加载并调用它的函数。
3.Java层
1)加载JNI库
通用的做法是在类的static语句中加载,调用System.loadLibrary("libname")方法
2)用native关键字来修饰由JNI层实现的函数
4.JNI层
1)注册JNI函数
a)静态方法
1.编写java代码,编译生成.class文件
2.使用javah 生成需要实现的头文件
3.javah -o output.h *.class
当java层调用native函数时,它会从对应的JNI库中寻找符合规则的函数名。如
果找到,则会将这个jave层的native函数与Native层的函数关联,其实就是保
存ntive层函数的指针。以后再使用java层的native函数时,直接使用保存的指
针即可。这项工作具体是由虚拟机完成的。
*JNI层的函数名字必须遵循固定的格式。
b)动态注册
1.Java native函数和JNI函数时一一对应的,由JNINativeMethod结构保存。
2.调用JNIEnv.RegisterNatives完成注册
3.当java层通过System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad的函数。如果有,就调用它,而动态注册的工作就是在这里完成的,同时还可以做一些初始化的工作。
2)JNIEnv
1.JNIEnv是一个与线程相关的代表JNI环境的结构体。它提供了一些JNI系统函数。它内部保存JNI函数指针数组。
2.通过JavaVM的AttachCurrentThread函数得到线程的JNIEnv
3.通过JavaVM的DetachCurrentThread函数来释放对应的资源。
d) JNI层通过JNIEnv获取jobject
1.用JNIEnv.GetFieldId获取类成员属性
2.用JNIEnv.GetMethodId获取类方法
e)JNI类型签名介绍
****
3)垃圾回收
Local reference:一旦JNI函数返回,其使用的jobject对象都可能被垃圾回收
Global reference:全局引用,只有主动释放才会被垃圾回收
Weak Global reference:弱全局引用,运行过程中可能会被垃圾回收,使用时
需要用JNIEnv.IsSameObject判断。
JNI层想要保存Java层中的某个对象时,可以使用Global reference.使用完后记得释放。对于Local reference,也需要在合适的时候进行回收,以免java虚拟机内不足。
分享到:
相关推荐
第2章 深入理解JNI 2.1 JNI概述 2.2 学习JNI的实例:MediaScanner 2.3 Java层的MediaScanner分析 2.3.1 加载JNI库 2.3.2 Java的native函数和总结 2.4 JNI层MediaScanner的分析 2.4.1 注册JNI函数 2.4.2 数据类型转换...
第2章 深入理解JNI / 13 2.1 JNI概述 / 14 2.2 学习JNI的实例:MediaScanner / 15 2.3 Java层的MediaScanner分析 / 16 2.3.1 加载JNI库 / 16 2.3.2 Java的native函数和总结 / 17 2.4 JNI层MediaScanner的分析...
第2章 深入理解JNI / 13 2.1 JNI概述 / 14 2.2 学习JNI的实例:MediaScanner / 15 2.3 Java层的MediaScanner分析 / 16 2.3.1 加载JNI库 / 16 2.3.2 Java的native函数和总结 / 17 2.4 JNI层MediaScanner的分析 / 17 ...
第2章 深入理解JNI 13 2.1 JNI概述 14 2.2 学习JNI的实例:MediaScanner 15 2.3 Java层的MediaScanner分析 16 2.3.1 加载JNI库 16 2.3.2 Java的native函数和总结 17 2.4 JNI层MediaScanner的分析 17 2.4.1 ...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Z ygote、SystemServer等...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Z ygote、SystemServer等...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
Android开发中,随着对移动程序的安全性、性能等方面的重视,JNI技术也越发重要。如今,多数企业在招聘中、高级程序员时,...后面两部分课程,将带领大家深入了解JNI交互原理,Native实战开发,让你真正掌握JNI技术。
第2章通过对android系统中的mediascanner进行分析,详细讲解了android中十分重要的jni技术;第3章分析了init进程,揭示了通过解析init.rc来启动zygote以及属性服务的工作原理;第4章分析了zygote、systemserver等...
第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 第8章 posix socket api:面向...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
[深入理解计算机系统(原书第2版)].(美)布莱恩特,奥哈拉伦.扫描版.pdf part1 http://download.csdn.net/detail/zhanglu231123/4555359 深入理解Android 卷I 扫描完整版 ... ... ...
Xposed框架的技术核心建立在Jvm原生的JNI机制之上,为了对Xposed框架进行深入分析,同时方便大家理解,我们从以下三个问题着手:1.Dalvik虚拟机在执行java层代码时如何识别JNI方法?2.怎样才能将java层普通方法注册...
第2章 深入了解AndroidNDK 2.1 AndroidNDK提供的组件 2.2 AndroidNDK的结构 2.3 以一个示例开始 2.3.1 指定AndroidNDK的位置 2.3.2 导入示例项目 2.3.3 向项目中添加原生支持 2.3.4 运行项目 2.3.5 用命令行对项目...
│ 高并发编程第二阶段10讲、volatile关键字深入详解.mp4 │ 高并发编程第二阶段11讲、volatile关键字总结.mp4 │ 高并发编程第二阶段12讲、观察者设计模式介绍.mp4 │ 高并发编程第二阶段13讲、使用观察者设计...
第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 ...