当前位置: 首页 > news >正文

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.lryc.cn/news/508220.html

相关文章:

  • day16 python(4)——UnitTest
  • Kafka快速扫描
  • python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块
  • 【6】期末复习C#第6套
  • 开源轮子 - EasyExcel01(核心api)
  • SpringBoot3+Vue3开发在线考试系统
  • 2. Kafka入门-开发环境准备
  • Halcon中histo_2dim(Operator)算子原理及应用详解
  • TCP 与 UDP
  • ubuntu 安装更新 ollama新版本
  • Numpy基本操作
  • 本地部署webrtc应用怎么把http协议改成https协议?
  • 基于xiaothink对Wanyv-50M模型进行c-eval评估
  • 使用k6进行kafka负载测试
  • Unity A*算法实现+演示
  • 浏览器要求用户确认 Cookies Privacy(隐私相关内容)是基于隐私法规的要求,VUE 实现,html 代码
  • 如何设计高效的商品系统并提升扩展性:从架构到实践的全方位探索
  • 使用计算机创建一个虚拟世界
  • datasets笔记:两种数据集对象
  • 【ETCD】【Linearizable Read OR Serializable Read】ETCD 数据读取:强一致性 vs 高性能,选择最适合的读取模式
  • 【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数
  • 不常用命令指南
  • spring mvc | servlet :serviceImpl无法自动装配 UserMapper
  • STM32 HAL库之串口接收不定长字符
  • Pyqt6的tableWidget填充数据
  • ASP.NET Core - 依赖注入 自动批量注入
  • UVM 验证方法学之interface学习系列文章(十一)virtual interface 再续篇
  • 面试题整理5----进程、线程、协程区别及僵尸进程处理
  • OpenTK 中帧缓存的深度解析与应用实践
  • 第2节-Test Case如何调用Object Repository中的请求并关联参数