本地方法接口和本地方法栈
本地方法(Native Method)
1、本地方法是一个 Java 调用非 Java 代码的接囗,是一种 Java 方法,该方法的实现由非 Java 语言实现,比如:C
2、该特征并非 Java 所特有,很多其它的编程语言都有这一机制,比如:在 C++中,可以用 extern "c" 告知 C++ 编译器去调用一个 C 的函数
3、在定义一个本地方法时,并不提供实现体(类似定义一个 Java 接口),其实现体是由非 Java 语言在外实现
4、作用:融合不同的编程语言为 Java 所用,初衷是融合 C / C++ 程序
5、标识符 native 可以与其它 Java 标识符连用,但 abstract 除外
6、除非是与硬件有关的应用,比如通过 Java 程序驱动打印机或者 Java 系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用 Socket 通信,也可以使用 Web Service 等
使用本地方法的目的
1、与 Java 环境的交互
(1)本地方法存在的主要原因:Java 应用需要与 Java 外的环境交互
(2)Java 需要与一些底层系统,如操作系统或某些硬件交换信息
(3)本地方法提供一个非常简洁的接口,而且无需去了解 Java 应用之外的繁琐的细节
2、与操作系统的交互
(1)JVM 支持 Java 语言本身和运行时库,它是 Java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成
(2)但 JVM 不是一个完整的系统,经常依赖于一底层系统的支持,这些底层系统常常是强大的操作系统
(3)通过使用本地方法,可以使用 Java 实现 jre 的与底层系统的交互,甚至部分 JVM 由 C 实现;还可以使用 Java 语言本身没有提供封装的操作系统的特性
3、Sun's Java
(1)Sun 的解释器由 C 实现,这使得它能与外部交互
(2)jre 大部分由 Java 实现,它也通过一些本地方法与外界交互
(3)例如:类 java.lang.Thread 的 setPriority() 方法是用 Java 实现的,但是它实现调用的是该类里的本地方法 setPriority(),该本地方法由 C 实现,并被植入 JVM 内部
(4)本地方法的具体实现由 JVM 直接提供,更多的本地方法由外部的动态链接库(external dynamic link library)提供,然后被 JVM 调用
本地方法栈
1、Java 虚拟机栈管理 Java 方法的调用,而本地方法栈管理本地方法的调用
2、本地方法栈属于线程私有
3、允许被实现成固定内存大小,或可动态扩展的内存大小
(1)在内存溢出方面相同
(2)如果线程请求分配的栈容量,超过本地方法栈允许的最大容量,JVM 将会抛出一个 StackOverflowError 异常
(3)如果本地方法栈可以动态扩展,并且在尝试扩展时,无法申请到足够的内存,或在创建新的线程时,没有足够的内存去创建对应的本地方法栈,则 JVM 将会抛出一个 OutOfMemoryError 异常
4、具体做法是 Native Method Stack 中登记 native 方法,在 Execution Engine 执行时,加载本地方法库
5、当某个线程调用一个本地方法时,则不再受虚拟机限制,且和虚拟机拥有同样的权限
(1)本地方法可以通过本地方法接口,来访问虚拟机内部的运行时数据区
(2)可以直接使用本地处理器中的寄存器
(3)直接从本地内存的堆中,分配任意数量的内存
6、不是所有 JVM 都支持本地方法
(1)JVM 规范没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等
(2)若 JVM 产品不打算支持 native 方法,可以无需实现本地方法栈
(3)在 Hotspot JVM 中,将本地方法栈、虚拟机栈合二为一
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战