我使用本机方法来解决字符串。但是当返回结果时我得到一个错误
JNI WARNING: input is not valid Modified UTF-8: illegal start byte 0xff
这是我的代码:
jstring Java_com_example_helloworld_NativeLib_helloWorld(JNIEnv* env,
jobject thiz, jstring src) {
const char* mystring = (*env)->GetStringUTFChars(env, src, (jboolean*) 0);
printf("mystring: %s ", mystring);
int length = sizeof(mystring) / sizeof(mystring[0]);
char *result = (char*) malloc(length);
int i = 0;
for (i = 0; i < length; i++) {
result[i] = mystring[i] + 1;
}
(*env)->ReleaseStringUTFChars(env, src, mystring);
return (*env)->NewStringUTF(env, result);
}
答案 0 :(得分:1)
阐述Joop Eggen的评论:
您应该使用strlen
来查找字符串的长度;目前你正在计算指针的大小。
int length = strlen(mystring);
你遇到的另一个问题是result
中的最后一个字符应该是0表示字符串的结尾:
char *result = (char*) malloc(length+1);
result[length] = 0;
更难的问题是处理UTF-8。向所有字符添加1将为某些输入创建无效字符序列。如果您只需要支持ASCII,快速修复只对ASCII字符执行操作,其余部分保持原样:
for (i = 0; i < length; i++) {
if (0 <= mystring[i] && mystring[i] < 0x7d)
result[i] = mystring[i] + 1;
else result[i] = mystring[i];
}