jcharArray str 转化为char buf
先说下问题的来龙去脉:
void JNICALL Java_com_interfaces_androidencode_YV12AddFont_YV12_1print_1char
(JNIEnv *env, jobject obj, jbyteArray pUserInfo, jint x, jint y, jint color, jcharArray str, jint strsize)
{
uint32_t mwidth = 0;
uint32_t mheight = 0;
jbyte* p = (*env)->GetByteArrayElements(env, pUserInfo, NULL);
uint32_t size = (*env)->GetArrayLength(env, pUserInfo);
jchar* array = (*env)->GetCharArrayElements(env,str, NULL);
uint32_t arraysize = (*env)->GetArrayLength(env, str);
char buf[arraysize+1];
int i = 0;
for(i = 0; i < arraysize; i++){
buf[i] = array[i];
}
buf[arraysize] = '\0';
print_string((uint8_t *)p, _x, _y, _color, mwidth, mheight,buf,arraysize);
(*env)->ReleaseByteArrayElements(env, pUserInfo, p, 0);
(*env)->ReleaseCharArrayElements(env, str, array, 0);
}
jcharArray str 如果不经过转化,直接传入
print_string((uint8_t *)p, _x, _y, _color, mwidth, mheight,(char *)str,arraysize);
由于java中字符是宽字符,是16位的,和c中char,占的位数不一样.
print_string函数中的str[0],str[2],str[4],对应array[0],array[1],array[2]
jchar* array = (*env)->GetCharArrayElements(env,str, NULL);
uint32_t arraysize = (*env)->GetArrayLength(env, str);
方法1:正确:
char buf[arraysize+1];
int i = 0;
for(i = 0; i < arraysize; i++){
buf[i] = array[i];
}
buf[arraysize] = '\0';
方法2:
错误:
运行一段时间后,出现问题;
char buf[arraysize+1];
int i = 0;
for(i = 0; i < arraysize; i++){
buf[i] = (char)*array;
array++;
}
buf[arraysize] = '\0';
针对以上代码出现问题的具体原因还在分析.