JNI:Java程序(VM)与本地函数的双向接口(调用通道)

(1)Java --JNI通道-->本地函数(JNI函数)

(2)本地程序--JNI通道的JNI接口-->Java

      

JNI使Java丧失跨平台性(本地程序需重新编译)

        

本地函数通过JNI以Java机制与VM交互,而不是C/C++规则

使用本地函数实现类库没有实现或效率更高的本地功能,最后通过JNI与VM交互

利用JNI函数,程序员可从一个固有方法的内部与JVM打交道。正如大家在前面的例子中看到的那样,每个JNI固有方法都会接收一个特殊的自变量作为自己的第一个参数:JNIEnv自变量——它是指向类型为JNIEnv_的一个特殊JNI数据结构的指针。JNI数据结构的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的指针。可从固有方法的内部发出对JNI函数的调用,做法是撤消对这些指针的引用(具体的操作实际很简单)。每种JVM都以自己的方式实现了JNI函数,但它们的地址肯定位于预先定义好的偏移处。

利用JNIEnv自变量,程序员可访问一系列函数。这些函数可划分为下述类别:

  • 传递或返回数据
  • 操作实例变量或调用使用垃圾回收的堆中对象的方法
  • 操作类变量或调用类方法
  • 操作数组
  • 对堆中对象加锁,以便被当前线程独占
  • 创建对象
  • 加载类
  • 抛异常
  • 捕获本地方法调用的Java方法抛出的异常
  • 捕获虚拟机异常
  • 告诉垃圾回收器某个对象不再需要

JNI函数的数量相当多,这里不再详述。相反,我会向大家揭示使用这些函数时背后的一些基本原理。欲了解更详细的情况,请参阅自己所用编译器的 JNI文档。

若观察一下jni.h头文件,就会发现在#ifdef _cplusplus预处理器条件的内部,当由C++编译器编译时,JNIEnv_结构被定义成一个类。这个类包含了大量内嵌函数。通过一种简单而且熟悉的语法,这些函数让我们可以从容访问JNI函数。例如,前例包含了下面这行代码:

(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);

它在C++里可改写成下面这个样子:

jEnv->ReleaseStringUTFChars(jMsg,msg);

大家可注意到自己不再需要同时撤消对jEnv的两个引用,相同的指针不再作为第一个参数传递给JNI函数调用。在这些例子剩下的地方,我会使用 C++风格的代码。

JNI Java本地接口(双向接口)相关推荐

  1. Java基础学习总结(79)——Java本地接口JNI详解

    对于java程序员来说,java语言的好处和优点,我想不用我说了,大家自然会说出很多一套套的.但虽然我们作为java程序员,但我们不得不承认java语言也有一些它本身的缺点.比如在性能.和底层打交道方 ...

  2. JNI的替代者—使用JNA访问Java外部功能接口 DLL

    JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...

  3. JNI (Java Native Interface)是什么

    JNI是Java Native Interface的缩写.从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代 ...

  4. java类引用接口的注释_java – 在接口类型上使用注释有什么好处?

    在这个 example中,注释类型(@interface)下面: @interface ClassPreamble { String author(); String date(); int curr ...

  5. 初识java类的接口实现

    初识java类的接口实现 如果两个类之间不存在继承关系,且两个类都想实现同一个接口,两个类都必须实现接口中全部方法,否则报语法错误 如果两个类之间存在继承关系也想实现同一个接口,父类如果实现了某个接口 ...

  6. closeable java_【转】java.io.Closeable接口

    说到java.io.Closeable接口就避不开java.lang.AutoCloseable接口,因为在java版本7.0时引入了java.lang.AutoCloseable接口,同时java. ...

  7. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  8. Objective-C 入门(七)协议 protocol(JAVA中的接口)

    Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...

  9. java字典写实例,基于JAVA的新华字典接口调用代码实例

    基于JAVA的新华字典接口调用代码实例 接口描述:基于JA V A的新华字典接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...

最新文章

  1. 使用Fiddler手机抓包https-----重要
  2. 图像处理之霍夫变换(直线检測算法)
  3. OPPO这次的新旗舰,开始“搞颜色”了,当然不是外壳的那种
  4. hdu 1798(几何问题)
  5. vue 修改favicon
  6. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...
  7. Java学习之连接数据库
  8. 超融合平台安装oracle,超融合平台集成实施方案
  9. c#中ref和out 关键字
  10. 小米虚高的估值泡沫要破了么?
  11. Python3 正则表达式学习
  12. Android Design 1: Back键和Up键在App导航中的表现
  13. 第四季-专题15-网卡驱动程序设计
  14. 数据库毕业设计参考文献最新合集
  15. 恶心的八皇后全解python版
  16. 为什么我们求职 找工作 一定要写好简历?
  17. 如何让一个IFRAME调用页面的背景为透明
  18. Python篇之编译py文件为pyc文件的方法总结
  19. 百度地图API底色主题更换
  20. vray 用于室内渲染的10大技巧,看进来!

热门文章

  1. matlab repmat()
  2. 矩阵快速幂 学习笔记
  3. 水晶报表-横向设计页面,设置网格高度
  4. C#测试数据库连接是否成功
  5. 在 VMware Clone Ubuntu Server 之后,解决网卡问题
  6. 测试站点写入文件权限代码下载
  7. windows批量添加用户
  8. 『流畅的Python』第12章:继承的优缺点
  9. Spring MVC 向前台页面传值-ModelAndView
  10. php随机产生4位的验证码