JVM的native方法

java native.loadlibrary,JNA Native.loadLibrary生成内存故障:__memmove_avx_unaligned_erms I develop an app in java that loads a C++ shared library using JNA. The detailed procedure is the following.Find library in the jaruse System.load( C_LIBRARY_PATH ) with the result of step 1Load libra... 阅读详情

JVM的native方法

一. 什么是Native Method
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
“A native method is a Java method whose implementation is provided by non-java code.”
在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。,下面给了一个示例:
public class IHaveNatives
{
native public void Native1( int x ) ;
native static public long Native2() ;
native synchronized private float Native3( Object o ) ;
native void Native4( int[] ary ) throws Exception ;
}
这些方法的声明描述了一些非java代码在这些java代码里看起来像什么样子(view).
标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)
一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。
native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被fianl标识,它被继承后不能被重写。
本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。

二.为什么要使用Native Method
java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
与java环境外交互:
有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
与操作系统交互:
JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
Sun’s Java
Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVM调用。

三.JVM怎样使Native Method跑起来:**
我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。

最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法

Java学习路线图:http://yun.itheima.com/map/22.html?mcgcsdn

最后希望所分享的技术文章和路线图能够帮助浏览文章的你

JNA加载DLL库 因为项目需要,要在java里调用佳博打印机的TSCLIB.dll库: 1:使用绝对路径 TscLibDll INSTANCE = (TscLibDll) Native.loadLibrary ("D:\\TSCLIB", TscLibDll.class); 此时要将TSCLIB.dll和TSCLIB.lib同时放在D盘下,调用打印机没问题 2:使用动态路径加载:(参考:http:// 阅读详情

相关推荐

java native 方法编写

将上面生成的 demo_Test.h 移到这个 c/c++ 项目中,将 jdk\include\jni.h 文件复制到这个项目zhong,jdk\include\win32\jni_md.h 也复制到这个项目中。将上面生成的 dll 文件复制到最开始创建的 java 项目中,使用 System.load 加载刚才生成的 dll,注意这里使用的是 dll 的绝对路径。将 demo_Test.h 中引入的 改成 "jni.h"在这个 cpp 文件中编写 java native 方法的方法体。

SHELLCODE_8BIT的博客 1302

java 中 Native.loadLibrary 不能加载 jar 包中库文件的解决方案

思路是工程启动后在 Native.loadLibrary 之前,将 jar 中 "BOOT-INF/classes/window_dll" 或者 "BOOT-INF/classes/linux_os" 中的 dll 或 os 库文件解压到外部磁盘目录中。windows环境: (HCNetSDK) Native.loadLibrary("E:\\xxx\\HCNetSDK.dll", HCNetSDK.class),

heshiyuan1406146854的博客 1万+

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 660

c调用其他类的方法_Java 的 Native 方法——今天又进步了

1. 简介1.1 个人理解初次遇见 native 是在 java.lang.String 源码中的一个 intern 方法:publicnativeStringintern();因为还是第一次遇到,所以就去搜了一些文章进行了解。下面就对一些 Native 关键字进行一些总结。native 也即 JNI —— Java Native Interface(Java 本地接口)。凡是一种...

weixin_39520595的博客 505

联想拯救者r7000p在ubuntu20.04未找到wifi适配器,安装rtl8852ae网卡驱动问题解决方案

新买的拯救者r7000p 2021款,装完ubuntu20.04之后显示未找到wifi适配器, 更换N次源之后还是只有一个显卡驱动,在网上找了很多方法,再自己折腾了一段时间后,总算是解决了这个问题。 1.设置bios 打开主板系统,将security boot设置为disenable,因为设计到修改内核配置,必须得关掉安全启动。 2.查询网卡状态 使用命令查询网卡(hardware of Internet)状态 lshw -C network 因为是双系统,在Windows下控制面板-设备管理器中可以

MCZ777的博客 1万+

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 690

jvm的native方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33966095的博客 357

Qt多线程实战:如何优雅地处理Modbus设备通信中的线程安全问题

本文深入探讨了在Qt框架下实现Modbus设备通信时的多线程安全问题,提供了优雅的解决方案。通过生产者-消费者模型、任务队列与锁机制等设计模式,有效解决了界面卡顿、数据包错乱等问题。文章还详细介绍了对象生命周期管理、信号槽连接类型选择等关键实现细节,帮助开发者构建稳定可靠的Modbus通信模块。

weixin_30897233的博客 483

java native 方法,jdk , jvm

nativenative是 Java 关键字,用于声明方法的实现不是在 Java 中,而是在本地代码中,通常是 C 或 C++。JVM 本身并不执行native方法的代码,它依赖于来与本地代码进行交互。native方法通常用于调用底层操作系统的功能,或者进行性能优化,尤其是在需要进行硬件操作或平台特定功能时。

qq_41577703的博客 548

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

JVM-Native和方法区

在JVM中,Native方法可以被声明为native,并且不需要实现任何Java代码,这种用 native 修饰的方法就是本地方法,这是使用 C 来实现的,然后一般这些方法都会放到一个叫做本地方法栈的区域。JNI提供了一组标准接口,使得Java程序可以调用本地方法,同时也提供了本地方法接口,以便本地方法库能够访问Java程序的数据和对象。总之,JVM的Native机制为Java程序提供了一个强大的接口,可以扩展Java平台的能力,并且与本地系统进行高效的交互。所以Java就产生了带有C和C++的程序。

weixin_71916648的博客 519

轻量化部署实战:C#上位机集成AI模型的3种方案深度对比(ML.NET/ONNX/TensorFlow.NET)

C#上位机部署AI模型,核心不是“选最强大的方案”,而是“选最适配的方案”——工控机的低配置、高稳定性需求,决定了“轻量化”和“部署简单”是选型的首要原则。回顾3种方案:ML.NET:原生、轻量化、零依赖,适合传统ML场景,低配置工控机首选;ONNX Runtime:通用、平衡、易落地,适合深度学习场景,工业落地首选;TensorFlow.NET:强大、灵活、纯C#,适合复杂模型,高配置工控机首选。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 363

[Golang实现JVM第六篇]实现Native方法

首先需要明确几个问题。 没有Native方法JVM什么也做不了 可能很多人认为native方法是Java里的禁区,使用本地方法会牺牲可移植性,而且还会有额外开销,貌似几乎没有程序员会在实际项目中写本地方法,这玩意就是个很冷门的东西。其实这种看法是错误的,哪怕一个Hello Word程序都是要严重依赖于本地方法的。在JDK中,你会发现任何涉及到I/O、线程操作的类,层层追踪源码后最终都能找到一个对应的native调用,真正把Hello World打印到控制台的正是这些native方法。而用于启动线程的Thre

停止更新 1069

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2378

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jvm的 native方法

一. 什么是Native Method    简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。    "A nati

xcliang9418的博客 4201

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jvm是怎么实现Java方法和native方法的连接

Java通过JNI接口调用Java native方法后,将结果反馈给Java方法的过程

weixin_44284706的博客 576

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

谈谈JVM中Native和方法区的概念

谈谈JVM中Native和方法区的概念

杨荧的优快云博客 1150

Jvm之 Native(本地方法) 和 方法区(Method Area)

虽然你主要用自己的工具做饭(Java 代码),但偶尔你需要借助邻居的设备(Native 方法)来搞定一些特定的任务。在 Java 中的意思就是“本地方法”,也就是非 Java 语言写的代码,通常是用 C 或 C++ 等语言编写的。每个类就像是超市里的商品,方法区就负责把这些“商品”(类和它们的信息)整齐地放在货架上,方便 JVM 在需要的时候随时“拿取”。是 JVM 内存结构的一部分,负责存储类的信息。JNI 是 Java 和其他语言之间的桥梁,它允许你在 Java 中调用其他语言编写的代码。

weixin_44748929的博客 2284

JVM详解-native 方法区

JVM详解 -> native & 方法区 1. native 关键字 native :凡是带了native关键字的,说明Java的作用范围达不到了,会调用底层C语言的库 进入本地方法栈;调用本地方法接口JNI,JNI作用:扩展Java的使用,融合不同的编程语言为Java所有,最初是为了融合C C++ 在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native方法 在最终执行的时候,在执行引擎中通过JNI加载本地方法库中的方法 目前该方法的使用越来越少了

baidu_38126306的博客 731

JVM 查找 native 方法的规则

  通过第一篇文章,大家明白了调用 native 方法之前,首先要调用 System.loadLibrary 接口加载一个实现了native 方法的动态库才能正常访问,否则就会抛出 java.lang.UnsatisfiedLinkError 异常,找不到 XX 方法的提示。现在我们想想,在 Java 中调用某个 native 方法时,JVM 是通过什么方式,能正确的找到动态库中 C/C++ 实...

waixiaoyu的博客 755

java native方法效率_JVM学习(二)——Native方法

在学习JVM运行机制的时候,发现本地方法区是用于执行Native方法的;故有此疑问,什么是Native方法呢?什么是Native方法一个Native Method就是一个java调用非java代码的接口(NDK也跟这有关吗?(疑问)一个Native Method由非java语言实现在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由...

weixin_30064949的博客 326

jvm中clone的native方法

假设有一个类Apple(Apple的colne只是简单的调用super.clone), 当我clone一个Apple对象时,首先可以通过在Apple的构造函数中加上输出证明Apple的构造器是不会被调用到的。但是如何证明Object的构造器也不会被调用到呢? 有没有什么工具或方法去证明clone是不会调用Object的clone方法的    我跟踪了colne这个native方法, 并下载了

西红柿炒土豆 949

JVM中的本地接口Native Interface和本地方法栈Native Method Stack

文章目录JVM中的本地接口Native Interface和本地方法栈Native Method Stack本地接口和本地方法栈在JVM中的位置本地接口本地方法栈Native Method Stack本地方法库 JVM中的本地接口Native Interface和本地方法栈Native Method Stack 本地接口和本地方法栈在JVM中的位置 首先来看一下本地接口Native Interface,本地方法栈Native Method Stack,和本地方法库在JVM中的位置,如下图: 本地接口 本地

xzy的博客 738

java native newInstance0方法在jvm底层实现原理

jvm.cpp实现这个方法JVM_NewInstanceFromConstructor。newInstance0底层实现逻辑。使用构造器反射对象实例。

u014200244的专栏 445
下一篇: 初学者学习python的几个建议
Tableau1
博客等级 码龄8年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值