Java中如何将类全限定名转换为JNI等效表示形式
Java类全限定名转JNI等效格式的实现
不需要手动维护映射规则或者写复杂的字符串替换逻辑,根据你使用的JDK版本直接选对应方案即可:
可直接调用的方法
- JDK 12 及以上版本:直接调用
Class实例的descriptorString()方法,即可得到完全符合JNI要求的类描述符。
这个方法是Java类库内置的、专门用来生成JVM内部使用的类描述符的接口,输出和JNI规范要求的格式完全对齐:对a.b.c.MyExample对应的Class对象,调用descriptorString()会直接返回La/b/c/MyExample;,不需要额外做字符串处理。 - JDK 12 之前的旧版本:类库没有提供一步生成的内置方法,可根据实际场景选择实现:
- 如果只是转换普通的、没有泛型的引用类型类,逻辑非常简单,基于现有
getName()的返回值处理即可:String jniName = "L" + obj.getClass().getName().replace('.', '/') + ";"; - 如果需要兼容数组类型、原始类型、嵌套类等复杂场景,直接用成熟JNI工具库里内置的类名转换静态方法即可,不需要自己处理边界情况。
- 如果只是转换普通的、没有泛型的引用类型类,逻辑非常简单,基于现有
格式差异说明
要注意两个API的输出区别:
Class.getName()返回的是Java开发者熟悉的全限定类名,用点分隔包路径,没有前后缀,比如a.b.c.MyExampledescriptorString()返回的是JVM规范定义的类描述符格式,也就是JNI接口识别的格式:用斜杠分隔包路径,引用类型类前面加L,后面加分号,比如La/b/c/MyExample;
内容的提问来源于stack exchange,提问作者user7698505
相关产品推荐
相关产品推荐

