Android NDK中jchar*转char*后每个元素间多出0的原因是什么?
问题原因分析
核心根因
该现象是Java char与C/C++ char的内存占用差异和Android平台默认小端字节序共同作用的结果。
具体拆解
1. 类型内存占用差异
- Java中的
char是16位无符号整数,占2字节内存,对应JNI层的jchar类型遵循同样的定义,专门用于存储UTF-16编码的字符。 - C/C++中的
char在绝大多数Android设备(ARM/ARM64架构)上是8位整数,仅占1字节内存。
2. 小数值的存储特征
你测试用的10、20、30均为小于256的小数值,存为2字节的jchar时,高8位全部为0,仅低8位存储实际数值。
Android平台默认采用小端字节序,多字节数值在内存中按「低字节在前、高字节在后」的规则排布:
- 值为10的
jchar对应内存为[0x0A(10的低8位), 0x00(高8位)] - 值为20的
jchar对应内存为[0x14(20的低8位), 0x00(高8位)] - 值为30的
jchar对应内存为[0x1E(30的低8位), 0x00(高8位)]
3. 强制指针转换的影响
直接将jchar*强转为char*,本质是把原本指向2字节内存单元的指针,修改为指向1字节内存单元的指针,遍历的时候会把每个jchar的两个字节单独拆分为两个char值。
原本3个jchar对应的连续6字节内存,转换为char数组后顺序就是[10, 0, 20, 0, 30, 0],和你观测到的输出完全一致。
额外代码优化提示
你代码中对jcharArray的转换操作可以简化,不需要取地址再解引用,直接做类型转换即可:
// 原冗余写法 jcharArray* chArray = reinterpret_cast<jcharArray*>(&objArray); jchar *data = env->GetCharArrayElements(*chArray, 0); // 优化后写法 jcharArray chArray = static_cast<jcharArray>(objArray); jchar *data = env->GetCharArrayElements(chArray, nullptr);
注意使用完data之后需要调用env->ReleaseCharArrayElements(chArray, data, 0)释放JNI局部引用,避免内存泄漏。
内容的提问来源于stack exchange,提问作者user3807476
相关产品推荐
相关产品推荐

