openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接

symbols-unix 文件部分内容

JVM_IHashCode
JVM_InitClassName
JVM_InitStackTraceElement
JVM_InitStackTraceElementArray
JVM_InitializeFromArchive
JVM_InternString

要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因,我们需要从构建过程、符号解析、链接以及符号表管理的角度来分析。

1. 构建系统和符号管理

在构建过程中,make 工具会根据不同的操作系统和目标架构进行条件编译。通过在 make/hotspot/lib/JvmMapfile.gmk 中设置的条件判断,特定的源文件和符号会被包含进来。例如,SYMBOLS_SRC 变量用于指定包含符号定义的文件,这些符号定义最终会被链接器使用,确保程序中的函数能够被正确解析和链接。

make

ifeq ($(call isTargetOsType, unix), true)SYMBOLS_SRC += $(TOPDIR)/make/data/hotspot-symbols/symbols-unix
endif

这段代码表明,当构建目标是 UNIX 系统时,symbols-unix 文件会被添加到 SYMBOLS_SRC 中。SYMBOLS_SRC 中的文件通常包含符号的定义,告诉链接器在链接时需要包含哪些符号。

2. 符号表的作用

在编译链接过程中,链接器依赖符号表来识别程序中的函数和变量。符号表包含了程序中所有函数、变量以及其他符号的名称和地址。JVM_InternString 方法是一个 JNI(Java Native Interface)方法,它在 Java 层调用时会映射到本地方法 JVM_InternString,该方法由 HotSpot 虚拟机提供。

  • JVM_InternString 是 HotSpot 中的本地方法,它的实现通常位于 JVM 相关的 C/C++ 源代码中。
  • Java_java_lang_String_intern 是 Java 层的方法,它调用了本地方法 JVM_InternString

为了确保 Java_java_lang_String_intern 在 Java 代码中能正确调用 JVM_InternString,在构建时必须确保 JVM_InternString 在符号表中可见。这就是为什么 symbols-unix 文件中需要包括 JVM_InternString 的符号。

3. JNI 方法调用和符号解析

在 JNI 中,Java 和本地代码通过符号来进行交互。当 Java 方法(如 String.intern)调用本地方法时,它会通过符号解析找到对应的本地方法实现。JVM_InternString 是本地方法的实现,它负责处理字符串的内存管理和字符串常量池的管理。

JNIEXPORT jobject JNICALL
Java_java_lang_String_intern(JNIEnv *env, jobject this)
{return JVM_InternString(env, this); // 调用本地方法
}

在这个代码段中,JVM_InternString 是本地方法的实现,它负责执行字符串的内存管理等任务。为了确保这个方法能正确链接到 Java 层调用的 String.intern 方法,JVM_InternString 必须在符号表中存在。如果它没有出现在符号表中,链接器就无法找到该方法的实现,导致编译错误或运行时错误。

4. 符号表中的定义

symbols-unix 文件正是为此目的存在的,它包含了所有需要在 UNIX 系统上链接的符号定义。这些符号可能是内置的(如 JVM_InternString)或者是外部库中提供的。在构建过程中,symbols-unix 文件会作为一个符号文件被链接器加载,确保所有需要的符号在最终的二进制文件中被正确解析和链接。

5. 总结

通过在 symbols-unix 文件中添加 JVM_InternString 的符号,确保了链接器能够在编译时正确地解析和链接 JVM_InternString 方法。JVM_InternString 是本地方法,它在 JNI 中被调用,并且在符号表中必须存在,以便链接器能找到它的实现。这是构建和链接过程中的一个重要步骤,尤其是在跨平台(如 UNIX 和 Windows)构建时,不同的符号管理方法和符号文件会根据操作系统类型而有所不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Spring Boot 3 中实现基于角色的访问控制

基于角色的访问控制 (RBAC) 是一种有价值的访问控制模型,可增强安全性、简化访问管理并提高效率。它在管理资源访问对安全和运营至关重要的复杂环境中尤其有益。 我们将做什么 我们有一个包含公共路由和受限路由的 Web API。受限路由需要数据库中用户的有效 JWT。 现在用户…

K8s HPA的常用功能介绍

Kubernetes 的 Horizontal Pod Autoscaler (HPA) 是一种自动扩展功能,用于根据资源使用情况(如 CPU、内存等)或自定义指标,动态调整 Pod 的副本数量,从而保证应用的性能和资源利用率。 以下是 HPA 的常用功能介绍&…

电子系统中用于降噪的接地

当接地系统中存在EMI、RFI 或由焊机、变速驱动器、电器等引起的电脉冲等干扰时,它们会在中性线和接地之间产生共模噪声,可能会影响电子设备。 国家电气规范 (NEC) 允许安装隔离接地插座 (IG),即磁轭和接地端子之间没有连接。轭是插座后面的金…

SmartX分享:SMTX ZBS 中 RDMA 技术简介

目录 背景如何实现存储网络是什么TCP/IPRDMARDMA 工作原理RDMA 的实现方案 ZBS 支持 RDMA 的要求 参考 背景 我们清楚,分布式存储将利用网络作不同设备的互联。最基础的如TCP/IP的IP SAN,进阶的有FC SAN、IB等等。 SmartX 支持 10G以上的TCP/IP网络作为…

【人工智能数学基础】——深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用

深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用 贝叶斯理论(Bayesian Theory)是概率论和统计学中的一个重要分支,它以托马斯贝叶斯(Thomas Bayes)命名,主要关注如何根据新的证据更…

使用JustAuth实现gittee登录

使用JustAuth实现gittee登录 登录流程&#xff1a; 点击 Github 图标时&#xff0c;调用 handleGiteeLogin获取 Gitee 登录地址并跳转Gitee 授权后&#xff0c;后端进行相关的验证登录等成功后回调到gitee填的回调地址 1.添加依赖 <dependency><groupId>me.zhy…

矩阵的基本知识

例题1&#xff1a;求矩阵最小值&#xff0c;和其所在的行和列 #include<stdio.h> int main() { int arr[10][10]; int g; scanf("%d",&g); int m,n,i,r c; for(i0;i<g;i) { scanf("%d %d",&m,&…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

【后端面试总结】深入解析进程和线程的区别

在操作系统和并发编程中&#xff0c;进程和线程是两个核心概念。它们各自承担着不同的职责&#xff0c;并在多任务处理中发挥着关键作用。本文将从定义、特性、应用场景以及优缺点等多个方面对进程和线程进行详细对比&#xff0c;帮助读者深入理解它们之间的区别。 一、进程和…

QT网络(二):TCP通信

传输层概念 传输控制协议&#xff08;transmission control protocol&#xff0c;TCP&#xff09;是一种被大多数 Internet 网络协议用于数据传输的底层网络协议&#xff0c;它是可靠的、面向流和连接的传输协议&#xff0c;特别适合用于连续数据传输。 应用层在网络模型中的…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

std::async 和 std::packaged_task

0、背景 在现代 C 中&#xff0c;std::async 和 std::packaged_task 是两个非常重要的工具&#xff0c;能够帮助我们更好地处理并发和异步操作。它们分别代表了异步执行任务的两种不同的方式&#xff0c;但都可以有效地将任务的执行从主线程或调用线程中分离出来&#xff0c;以…

windows上安装Redis

下载&#xff1a;https://github.com/tporadowski/redis&#xff08;官方不提供windows版&#xff09; 配置文件里设置密码&#xff1a;requirepass 123456 添加服务的命令&#xff1a; redis-server --service-install redis.windows-service.conf --loglevel verbose (--serv…

TypeScript 与 JavaScript

文章目录 一、为 JavaScript 库添加类型定义(一)什么是类型定义文件(.d.ts 文件)(二)手动编写类型定义和使用现有类型定义(如 DefinitelyTyped)手动编写类型定义使用现有类型定义(如 DefinitelyTyped)二、在 TypeScript 项目中使用流行的 JavaScript 库(如 jQuery、…

从源码构建安装Landoop kafka-connect-ui

背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署&#xff0c;我们之前的kafka-connect-ui就是通过docker部署的&#xff0c;但是&#xff0c;最近发现个问题&#xff1a;当使用docker部署且防火墙使用的是firewalld的情况下&#xff0c;就会出现端口冲突。…

算法—动态规划

一、简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将原问题分解为若干个子问题来求解最优化问题的算法思想。动态规划常常用于解决那些可以被分解为更小的重叠子问题的场景。 与分治法的区别在于&#xff0c;分治法会将问题分解成独…

Android GO 版本锁屏声音无效问题

问题描述 Android go版本 在设置中打开锁屏音开关&#xff0c;息屏灭屏还是无声音 排查 vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java private void setupLocked() {...String soundPath Settings.G…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

Tomcat的安装即使用

Tomcat的概念 Tomcat服务器是Java语言开发的&#xff0c;免费的开放源代码的Web应用服务器。 Tomcat处理静态HTML的能力远不及Apache或者Nginx&#xff0c;通常是作为一个Servlet和JSP容器&#xff0c;单独运行在后端。 Tomcat是由三个功能组合而成&#xff1a; java servlet&…

Linux:进程(环境变量、程序地址空间)

目录 冯诺依曼体系结构 操作系统 设计操作系统的目的 操作系统的管理 进程 PCB fork 进程状态 进程状态查看 僵尸进程 孤儿进程 进程优先级 查看、修改进程优先级命令 竞争、独立、并行、并发 进程切换 活动队列和运行队列 活动队列 过期队列 active指针…