首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么hotspot jvm在其JNI模块中使用extern "C“?

HotSpot JVM在其JNI模块中使用extern "C"是为了确保与C语言的兼容性和互操作性。

在Java中,JNI(Java Native Interface)允许Java代码调用本地(即非Java)代码,这对于与底层系统交互或使用特定的本地库非常有用。由于C语言是与操作系统和硬件交互的主要语言之一,因此使用C语言编写的本地代码是最常见的情况。

使用extern "C"是一种C++语言的特性,它告诉编译器将函数按照C语言的方式进行编译和链接。这是因为C++编译器会对函数名进行修饰(name mangling),以支持函数重载和其他C++特性,而C语言不会进行修饰。在JNI模块中,我们需要确保Java代码能够正确地调用C语言函数,因此需要使用extern "C"来告诉编译器按照C语言的方式进行处理。

使用extern "C"的优势是确保了跨语言的兼容性,使得Java代码能够与C语言代码无缝地进行交互。这样,我们可以在Java中调用C语言函数,实现更高效的底层操作或利用特定的本地库。

在云计算领域,使用JNI可以实现与底层系统的交互,例如调用操作系统提供的API、访问硬件设备或使用特定的本地库。这在开发云原生应用程序时非常有用,可以充分利用底层系统资源和功能。

对于腾讯云相关产品,推荐使用云函数 SCF(Serverless Cloud Function)来部署和运行Java代码,以实现与底层系统的交互。云函数 SCF 是一种无服务器计算服务,可以根据实际需求弹性地运行代码,无需关心服务器的管理和维护。您可以通过腾讯云官方文档了解更多关于云函数 SCF 的信息:云函数 SCF

总结:HotSpot JVM在其JNI模块中使用extern "C"是为了确保与C语言的兼容性和互操作性,使得Java代码能够无缝地与C语言代码进行交互。这在云计算领域中非常有用,可以实现与底层系统的交互和利用特定的本地库。腾讯云的云函数 SCF 是一个推荐的产品,用于部署和运行Java代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java底层-本地接口(JNI)

为什么会有本地接口的概念呢?...由于JVM底层就有C++的影子,所以JVM也提供了JNI(Java本地接口:Java Native Interface,)技术作为其它语言(主要是C/C++)通信的API。...#define _Included_com_studyjava_email_jni_main_Main #ifdef __cplusplus extern "C" { #endif /* * Class...#endif #endif 当头文件有了之后,我们我们就需要编写它的实现,首先定义.cpp文件(可以使用C++开发工具或者纯文本编写也是可以的), cpp文件首先引入我们生成的头文件,引入头文件之后...有C++环境之后,编译过程可能会出现下面报错, 'jni.h' file not found 这是因为我们引入的jni.h找不到,我们可以将jdk路径下的include复制出来,和上面编译的文件同级

1.2K10
  • Java程序main方法执行流程

    在文章开头说过,launcher/main.c的main函数是java程序的启动函数,在main函数调用了JLI_Launcher函数,在JLI_Launcher会调用LoadJavaVM函数加载虚拟机的动态链接库...之后再JavaMain函数,会根据JNI_CreateJavaVM虚拟机创建函数来初始化虚拟机,此时已经是在一个新的线程运行了。...JNI_TRUE; } 从动态链接库中找到创建虚拟机的入口函数后,会把InvocationFunctions结构体作为参数一路传递到JavaMain函数,并在其中发起调用。...如java基础类型、事件队列、全局锁、JVM性能统计区、大块内存池chunkpool等 创建JavaThread 初始化对象监视器ObjectMonitor,它是Java语言级别的同步子系统 初始化全局模块...,这些模块Hotspot的整体基础,如字节码初始化、类加载器初始化、编译策略初始化、解释器初始化等等。

    1.2K30

    JVM--JNI的运行机制

    在这种情况下,我们往往会牺牲可移植性,在 Java 代码调用 C/C++ 代码(下面简述为C 代码),并在其中实现所需功能。...举个例子,Object类便拥有一个registerNatives方法,所对应的 C 代码如下所示: //注:Object类的registerNatives方法的实现位于java.base模块里的C代码...并且,这些 C 函数的名字并不符合默认命名规则。 当使用第二种方式进行链接时,我们需要在其他 native 方法被调用之前完成链接工作。...因此,如果在其他线程中使用当前线程的JNIEnv,会使这部分代码错误识别当前线程。 JNI 会将 Java 层面的基本类型以及引用类型映射为另一套可供 C 代码使用的数据结构。...HotSpot 虚拟机是通过句柄(handle)来完成上述需求的。这里句柄指的是内存 Java对象的指针的指针。

    48220

    如何找到native方法对应的Hotspot源码

    二、找方法 系统提供的JNI模块注册native方法有两种方式,所以找的话也有两种情况: 1、直接调用JVM模块的方法,在每个.c文件的头部就可以找到 [53yvjd413g.png?...] 2、JNI模块定义一个方法,直接找 [j0bucf0pg9.png?...除此之外,还得掌握HSDB这款工具的使用,能熟练地用它去查找JVM内部找到你想要的数据。...源码的顺序:先把JVM的启动流程整个看一遍,这时候会碰到很多不知道干啥有啥用的类、不知道为什么存在的流程…不用管,理清主线就可以了。...JNI行吗?不行!JNI能做的事情都被Hotspot限制死了。你想做的一些事情,只有修改Hotspot源码这一招。我给大家分享一招最简单的。咱们就拓展反射的API吧。

    1.1K60

    Java线程创建过程的各种细节

    Linux线程创建 线程能力是操作系统才有的,固Java的线程机制一定是基于OS的线程机制实现的,加上些许JVM自身的考虑在其中。这些考虑在哪能看到?JSR规范。...这一步执行完,新创建的线程就会马上执行java_start方法,java_start方法最终会通过JNI调用Java代码的run方法。 第18句是将原生线程的ID存储到OSThread。...为什么要创建分离线程,而不是普通线程呢?这就要说到分离线程的好处。也不得不感叹写JVM的大佬对硬件、对OS的精通程度。 在我们使用默认属性创建一个线程的时候,线程是 joinable 的。...目前不太理解JVM为什么要这样设计,所以我在手写JVM的课程,我准备反其道而行,看看这样实现存在什么样的问题或者不便,这些问题或不便应该就是JVM这样设计的理由。...完整学完你就可以:1、用Java写一个Java虚拟机,从而深入理解运行系统的底层细节;2、有能力自行研究Hotspot源码及其他用C语言、C++写的中间件源码;3、能够用C语言、C++写任何你感兴趣的基础算法如

    76130

    JVM故障分析及性能优化实战(II)——jstack生成的Thread Dump日志结构解析

    jni_DestroyJavaVM() 方法会唤起DestroyJavaVM 线程。...,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收; (4)JVM为什么要单独用一个线程来执行finalize()方法呢?...> (a java.lang.ref.Reference$Lock) "VM Thread" JVM中线程的母体,根据HotSpot源码关于vmThread.hpp里面的注释,它是一个单例的对象(最原始的线程...该线程在JVM使用得比较频繁,比如:定期的内存监控、JVM运行状况监控。...第五部分:JNI global references count 这一部分主要回收那些在native代码上被引用,但在java代码却没有存活必要的引用,对于防止因为应用代码中直接使用native库或第三方的一些监控工具的内存泄漏有非常大的帮助

    2.3K40

    JVM系列(一):JVM基本概念知识笔记

    3、JVM的版本 HotSpot VM:JDK 默认内置 JVMHotSpot VM,应用最广泛的JVM,大家最常用的就是这个。...4、JVM的体系结构 类加载器:在JVM启动时或者是在类运行时将需要的class文件加载到JVM。...执行引擎:负责执行class文件包含的字节码指令,相当于实际机器上的CPU 内存区域:jvm将内存划分为若干个区以模拟实际机器上的存储、记录和调度功能模块 本地方法调用:调用CC++实现的本地方法的代码返回相应的结果...5.2 虚拟机的执行 一个运行的Java虚拟机有着一个明确的任务:执行Java程序 程序开始执行时JVM才运行,程序结束时它就停止。...JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出 IT技术分享社区 个人博客网站:https://

    38520

    Android NDK开发入门

    4,JNI的字符串处理 4.1 native操作JVM JNI会把Java中所有对象当做一个C指针传递到本地方法,这个指针指向JVM内部数据结构,而内部的数据结构在内存的存储方式是不可见的.只能从JNIEnv...指针指向的函数表中选择合适的JNI函数来操作JVM的数据结构。...首先,需要将jstring转为C风格的字符串类型char*后才能使用,这里必须使用合适的JNI函数来访问JVM内部的字符串数据结构。...在使用JNI时,由于本地代码不能直接通过引用操作JVM内部的数据结构,要进行这些操作必须调用相应的JNI接口间接操作JVM内部的数据内容。...我们不需要关心JVM对象的是如何存储的,只需要学习JNI的三种不同引用即可。

    1.6K50

    openjdk使用_深入地理解

    *ifn) { //加载Microsoft环境c运行时库,提供必要的函数库调用和启动函数 //后面创建线程启动JVM使用c运行时库函数_beginthreadex LoadMSVCRT..._beginthreadex是一个c运行时库函数,其中: arg1:安全属性,NULL为默认安全属性 arg2:线程堆栈大小,如果为0,则线程堆栈大小和创建它的线程的相同,在JVM参数- 可以使用-Xss...  其中调用的CreateJavaVM函数,在前面已经初始化,使用JNI来调用JNI_CreateJavaVM(jvm.dll)。...[DllImport("jvm.dll")] public unsafe static extern int JNI_CreateJavaVM(void** ppVm, void** ppEnv..., void* pArgs); 1.3 C++层面的类加载器   前面我们简单介绍了jvm的启动过程,进入jni.cpp,调用Threads::create_vm((JavaVMInitArgs*)

    84120

    【Rust笔记】Rust与Java交互-JNI模块编写-实践总结

    JNI简单来说是一套Java与其他语言互相调用的标准,主要是C语言,官方也提供了基于CC++接口。...关于JNI的历史背景以及更详细的介绍可以参考官方文档 在Rust中和Java互相调用,可以使用原始的JNI接口,也就是自己声明JNIC函数原型,在Rust里按照C的方式去调用,但这样写起来会很繁琐,而且都是...jni::JNIEnv; #[no_mangle] pub unsafe extern "C" fn Java_pers_metaworm_RustJNI_init(env: JNIEnv, _class...::JNIEnv; #[no_mangle] pub unsafe extern "C" fn Java_pers_metaworm_RustJNI_addInt( env: JNIEnv,...函数将当前线程附加到JVM上,来获得一个JNIEnv #[no_mangle] pub unsafe extern "C" fn Java_pers_metaworm_RustJNI_callJavaThread

    98730

    面经手册 · 第19篇《Thread.start() ,它是怎么让线程启动的呢?》

    把这段 Java 的线程代码,到 JDK 方法使用,以及 JVM 的相应处理过程,展示给大家,以方便我们后续逐步分析。...图 19-1 线程启动分析 「以上」,就是一个线程启动的整体过程分析,会涉及到如下知识点: 线程的启动会涉及到本地方法(JNI)的调用,也就是那部分 C++ 编写的代码。.../libjava/Thread.c jvm.cpp:https://github.com/JetBrains/jdk8u_hotspot/blob/master/src/share/vm/prims/jvm.cpp...size_t stack_sz,表示进程已有的线程个数。 「这两个参数」,都会传递给 os::create_thread 方法,用于创建线程使用。...如果需要获得以上高清大图,可以添加小傅哥微信(fustack),备注:Thread大图 六、系列推荐 HashCode为什么使用31作为乘数? HashMap 扰动函数、负载因子是做什么的?

    21310
    领券