在本机方法中更改字符串

时间:2014-08-08 10:57:42

标签: java utf-8 java-native-interface native

我使用本机方法来解决字符串。但是当返回结果时我得到一个错误

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

1 个答案:

答案 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];
}