Android新版本中JNI::NewStringUTF的修改版UTF-8处理逻辑是否有变化?
Android 31+ 中 JNI::NewStringUTF 对4字节UTF-8的处理逻辑变更
是的,这个处理逻辑确实发生了变更。
早期Android版本的限制
在Android 31之前,JNI的NewStringUTF严格遵循Modified UTF-8编码规则:
- Modified UTF-8不支持标准UTF-8的4字节序列(对应U+10000及以上的Unicode字符,比如大部分emoji),而是要求用两个UTF-16代理对的Modified UTF-8编码来表示这类字符。
- 所以当传入包含4字节的标准UTF-8字符串时,会触发如下错误:
input is not valid Modified UTF-8
Android 31及以上的调整
从Android 31(API级别31)开始,ART运行时修改了NewStringUTF的实现:
- 不再强制要求输入必须是Modified UTF-8,而是直接兼容标准UTF-8编码,包括4字节的字符序列。
- 你测试的字符串十六进制转储如下,其中包含多个4字节UTF-8编码的emoji字符:
000000: e2 98 ba f0 9f 98 8a f0 9f 98 80 f0 9f 98 81 f0 ................ 000010: 9f 98 82 f0 9f 98 83 f0 9f 98 84 f0 9f 98 af f0 ................ 000020: 9f 98 89 f0 9f 98 88 f0 9f 98 87 ...........
这类字符串现在可以被NewStringUTF正常解析并转换成Java字符串。
这个变更主要是为了简化JNI与Native层的字符串交互,减少开发者在编码转换上的适配成本,让标准UTF-8的使用更顺畅。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

