有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将jchararray分配给常量unsigned char

我将char[]从java传递到jni:

function(char [] aChar);

然后我在jni上读了char[]:

JNIEXPORT jbyteArray JNICALL
packagename_function(JNIEnv *env, jobject obj, jcharArray aChar) {

  const unsigned char *theValue;
}

现在我想指定aChar作为该值的一个值

正确的分配方式是什么


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    这里有两个选项:

    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. 可以将字符作为字符串对象传递

      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);
      

      在将字符串从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

  3. # 3 楼答案

    感谢@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);