将jchararray分配给const unsigned char

时间:2018-01-04 01:02:18

标签: java android c java-native-interface

我将一个char []从java传递给jni:

updateLocale: (root, { locale }, context) => {

  const data = {
    language: {
      __typename: 'Language',
      locale,
    }
  };
  context.cache.writeData({ data });
  return data;
};

然后我在jni读了char []:

function(char [] aChar);

现在我想将aChar指定为theValue的值。

分配它的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

这里有两个选项:

  1. 你可以传递数组(就像你一样),然后你需要检索它的元素:

    http://jnicookbook.owsiak.org/recipe-No-012/

    /* get size of the array */
    jsize len = (*env)->GetArrayLength(env, array);
    
    /* get the body of array; it will be referecende by C pointer */
    jchar *body = (*env)->GetCharArrayElements(env, array, 0);
    
    /* do some stuff */
    for(int i=0; i < len; i++) {
      printf("Char value: %c\n", body[i]);
    }
    
    /* release body when you decide it is no longer needed */
    (*env)->ReleaseCharArrayElements(env, array, body, 0);
    
  2. 您可以将字符作为String对象传递

    http://jnicookbook.owsiak.org/recipe-No-009/

    // we have to get string bytes into C string
    const char *c_str;
    c_str = (*env)->GetStringUTFChars(env, str, NULL);
    if(c_str == NULL) {
      return;
    }
    
    printf("Passed string: %s\n", c_str);
    
    // after using it, remember to release the memory
    (*env)->ReleaseStringUTFChars(env, str, c_str);
    

    如果将String从Java传递给C,则必须更改两件事:

    • 您需要将方法签名更改为

      packagename_function(JNIEnv *env, jobject obj, jstring aChar)  
      
    • 在Java代码中,您必须从字符

      创建字符串
      char data[] = {'a', 'b', 'c'};
      String str = new String(data);
      

    然后,将其传递给本机代码。

    请注意!类型长度要小心!您可以随时查看:

    https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html

答案 1 :(得分:0)

在java方面,char是用UTF16编码的,是计数器部分jni方面是unsigned short而不是unsigned char,所以我想如果你想将java方char数组设置为jni方,你有两个选择: 1.在java中,使用UTF8编码将char数组转换为字节数组。 2.或者在jni端,将UTF16编码字符串转换为UTF8字符串。 我认为之前的选项更方便。

答案 2 :(得分:0)

感谢@mko给我的想法。我的最终代码是:

/* get size of the array */
jsize len = (*env)->GetArrayLength(env, aChar);

/* get the body of array; it will be referecende by C pointer */
jchar *body = (*env)->GetCharArrayElements(env, aChar, 0);

jstring mystr =  (*env)->NewString(env, body, len);

/* release body when you decide it is no longer needed */
(*env)->ReleaseCharArrayElements(env, aChar, body, 0);

const unsigned char *theValue = (*env)->GetStringUTFChars(env,mystr, NULL);