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

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.kler.cn/a/451084.html

相关文章:

  • HW护网分析研判思路,流量告警分析技巧
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • day14-16系统服务管理和ntp和防火墙
  • 使用 perf 工具进行性能分析
  • 在 Vue3 项目中安装和配置 Three.js
  • 掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计
  • 【逆向篇】Web逆向WebPack结构分析
  • 阿里云 Java 后端一面,什么难度?
  • 第11周作业
  • 全国硕士研究生入学考试(考研)常识详解之分数构成:初试成绩、复试成绩及复录比
  • C++练习:图论的两种遍历方式
  • 无人直播源码
  • 管理面板Ajenti的在Windows10下Ubuntu24.04/Ubuntu22.04里的配置管理
  • Redis的主从集群以及哨兵机制学习总结
  • Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
  • 单片机 STM32入门
  • windows C#-对象和集合初始值设定项(中)
  • RustDesk远程及自建服务器搭建教程
  • Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
  • 国标GB28181设备管理软件EasyGBS:P2P远程访问故障排查指南(设备端)
  • 自然语言处理与知识图谱的融合与应用
  • K8s - openeuler2203SP1安装 K8s + flannel
  • 浅谈 前端验证码那些事
  • STM32 与 AS608 指纹模块的调试与应用
  • keepalived踩坑记录
  • 前端:纯前端快速实现html导出word和pdf