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[]