我将一个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的值。
分配它的正确方法是什么?
答案 0 :(得分: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);
您可以将字符作为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);