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虚拟机内不足。
分享到:
相关推荐
在深入了解JNI(Java Native Interface)之前,我们需要明确一点:Android应用程序的主要部分是基于Java开发的,并且这些Java类会被编译成Dex格式的字节码,然后在Dalvik虚拟机上运行。这种设计模式为Android应用...
JNI在许多场景下都至关重要,比如提升性能、利用硬件特性、调用系统库或者整合第三方库等。本培训资料将深入探讨JNI的概念、使用方法以及在实际开发中的应用。 一、JNI基本概念 JNI是一种接口,允许Java代码和其他...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种机制,使得他们可以在Java代码中调用本地(非Java)代码,...理解并熟练运用JNI,对于开发高效、跨平台的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的分析 / 17 ...
1. **第二章:JNI入门** – 针对初次接触JNI的读者,通过一个简单的示例介绍JNI的基础用法。 2. **第三至第十章:深入JNI** – 对JNI的各种特性进行系统性的介绍,包括详细的示例和解释。 3. **第十一至第十三章:...
1. **第二章——JNI简介**:这一章节通过一个简单的示例介绍了JNI的基本概念,适合对JNI尚不熟悉的初学者。 2. **第三章至第十章——JNI特性详解**:这些章节系统地介绍了JNI的各个方面,包括但不限于类型转换、...
这个例子"android studio中JNI调用第三方库例子"是基于谷歌官方提供的"hello-libs"示例项目,旨在帮助开发者了解如何在Android Studio中使用JNI来调用预编译的第三方动态链接库(.so文件)。 首先,我们需要理解JNI...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码...通过深入理解和实践这些内容,开发者将能够熟练地利用JNI进行Java与本地代码的交互,实现更高效、更灵活的Java应用。
第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 ...
第二本书籍“05134659405.pdf”可能深入讨论了JNI的高级特性,比如如何使用JNI进行性能优化,例如通过本地方法实现计算密集型任务。此外,它可能还会涉及JNI在多线程环境中的使用,以及如何处理跨语言内存管理,确保...
- **JNI的高级特性**:从第3章到第10章,本书深入探讨了JNI的各种特性和功能,并提供了相应的示例代码,这对于希望深入了解JNI的读者非常有用。 - **JNI数据类型定义**:第11章至第13章详细列举了JNI支持的所有数据...
1. **第二章**:通过简单的示例介绍JNI编程的基础。 2. **第三章至第十章**:详细介绍JNI的各种特性和功能,并提供具体的示例。这部分是本书的核心内容,对于理解和掌握JNI非常关键。 3. **第十一章至第十三章**:...
1. **入门教程**:第二章通过一个简单的示例,向初次接触JNI的读者介绍其基本概念和工作原理。这部分内容适合对JNI不熟悉的初学者,帮助他们快速理解和掌握JNI的基本用法。 2. **全面介绍**:第三至第十章系统地...
- JNI编程中需要处理各种异常情况,并了解JNI环境的配置和故障排除方法。 - JNI编程系列包括基础篇、中级篇、高级篇等多个部分,逐步深入讲解JNI编程的各个方面。 以上知识点是针对JNI完全技术手册标题、描述和部分...
1. **简明教程**:第二章通过实例介绍了JNI的基础知识,适合对JNI没有深入了解的新手。 2. **深入讲解**:第三至第十章详细阐述了JNI的各项功能,配合丰富的示例,覆盖了JNI的重要且常用特性,为开发者提供了实践...
通过分析和运行这个项目,你可以更深入地理解JNI调用第三方DLL的全过程。 总的来说,这个实例是一个宝贵的教育资源,它展示了如何利用JNI将Java应用程序与C++编写的第三方DLL集成。通过学习和实践这个实例,开发者...
首先,我们来了解JNI的基本结构。JNI接口由一组头文件定义,这些头文件包含了Java类、方法ID、字段ID等数据结构,以及用于在Java和本地代码之间进行交互的函数。通过JNI,开发者可以访问Java对象、调用Java方法,...
JNI(Java Native Interface)是Java平台的一个重要...总的来说,JNI是连接Java世界与本地代码的关键工具,通过深入理解和熟练运用JNI,开发者可以充分利用Java的跨平台优势和C/C++的高效性能,解决特定场景下的挑战。
《JNI-study》这本书显然是针对希望深入理解和实践JNI技术的Java开发者的。书中可能涵盖了以下关键知识点: 1. JNI基础:介绍JNI的基本概念,包括JNI头文件、本地方法接口、本地方法注册、JNIEnv指针等核心元素。 ...