You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 18:09:03