`

第2章 深入理解JNI

阅读更多
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虚拟机内不足。

 
 
分享到:
评论

相关推荐

    《深入理解Android》卷Ⅰ

    第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 数据类型转换...

    《深度理解Android:第一卷》

    第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的分析...

    深入理解Android卷1全

    第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 ...

    深入理解Android:卷I--详细书签版

    第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 ...

    深入理解Android:卷2

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Z ygote、SystemServer等...

    《深入理解Android:卷I》试读本

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...

    深入理解Android卷1

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Z ygote、SystemServer等...

    深入理解Android 卷1.pdf

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...

    深入理解Android++卷1pdf电子书

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...

    Android JNI详解,让你彻底了解JNI (上)

    Android开发中,随着对移动程序的安全性、性能等方面的重视,JNI技术也越发重要。如今,多数企业在招聘中、高级程序员时,...后面两部分课程,将带领大家深入了解JNI交互原理,Native实战开发,让你真正掌握JNI技术。

    深入理解Android 卷I

    第2章通过对android系统中的mediascanner进行分析,详细讲解了android中十分重要的jni技术;第3章分析了init进程,揭示了通过解析init.rc来启动zygote以及属性服务的工作原理;第4章分析了zygote、systemserver等...

    Android C++高级编程——使用NDK完整版

    第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 第8章 posix socket api:面向...

    深入理解Android

    第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...

    [深入理解计算机系统(原书第2版)] -高清扫描版

    [深入理解计算机系统(原书第2版)].(美)布莱恩特,奥哈拉伦.扫描版.pdf part1 http://download.csdn.net/detail/zhanglu231123/4555359 深入理解Android 卷I 扫描完整版 ... ... ...

    Xposed框架原理深入研究

    Xposed框架的技术核心建立在Jvm原生的JNI机制之上,为了对Xposed框架进行深入分析,同时方便大家理解,我们从以下三个问题着手:1.Dalvik虚拟机在执行java层代码时如何识别JNI方法?2.怎样才能将java层普通方法注册...

    pro_android_cpp_with_the_ndk.pdf

    第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 用命令行对项目...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段10讲、volatile关键字深入详解.mp4 │ 高并发编程第二阶段11讲、volatile关键字总结.mp4 │ 高并发编程第二阶段12讲、观察者设计模式介绍.mp4 │ 高并发编程第二阶段13讲、使用观察者设计...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 ...

Global site tag (gtag.js) - Google Analytics