java - android ndk - 将 jchar* 转换为 char*
问题描述
为什么将 jchar* 转换为 char* 时,c++ 在每个数组元素之间添加一个零?
爪哇:
public char[] mychar;
.
.
mychar = new char[3];
mychar[0] = 10;
mychar[1] = 20;
mychar[2] = 30;
c++:
Java_com_example_bb_mainact_getchar(JNIEnv *env, jobject thiz) {
jclass cls = env->GetObjectClass(thiz);
jfieldID fieldId = env->GetFieldID(cls, "mychar", "[C");
jobject objArray = env->GetObjectField (thiz, fieldId);
jcharArray* chArray = reinterpret_cast<jcharArray*>(&objArray);
jchar *data = env->GetCharArrayElements(*chArray, 0);
LOGI( "data[0]: %d", data[0]); // --> 10
LOGI( "data[1] : %d", data[1]); // --> 20
LOGI( "data[2] : %d", data[2]); // --> 30
char* data2 = reinterpret_cast<char *>(data);
LOGI( "data2[0] : %d", data2[0]); // --> 10
LOGI( "data2[1]: %d", data2[1]); // --> 0
LOGI( "data2[2]: %d", data2[2]); // --> 20
.
为什么从 jchar* 转换为 char* c++ 时会像这样制作数组?{10 , 0 , 20 , 0 , 30}
解决方案
jchar
是 16 位类型。char
通常是 8 位类型。
您可以解决这个问题,例如,将data
其视为指向一组 16 位元素的指针,或者在 Java 端使用 abyte[]
而不是 a char[]
。
推荐阅读
- c# - 蛮力函数输入的算法以找到最大值
- javascript - Firebase angularfire2 - 如何仅从当前用户返回数据?
- ruby-on-rails - 删除印象派宝石的 N+1 个查询
- .net-core - 无法在 dotnet Core 2.1 中创建新角色
- javascript - toFixed 不是函数吗?
- sql-server - 使用带有 SQL Server 的 EF Core 2.1 进行正确的并发处理
- perl - 如何从 Perl 中的结构数组中删除重复项?
- java - 如何使用 .stream() 将存储库中的数据按字母顺序排序
- esp8266 - 我无法使用 micropython 在 ESP8266/nodemcu 上获得 python 提示
- ruby - 将数组元素转换为哈希