android ndk - 将 jchar* 转换为 char*
android ndk - cast jchar* to char*
为什么在将 jchar* 转换为 char* 时,c++ 在每个数组元素之间添加一个零?
java :
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 端使用 byte[]
而不是 char[]
。
为什么在将 jchar* 转换为 char* 时,c++ 在每个数组元素之间添加一个零?
java :
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 端使用 byte[]
而不是 char[]
。