【问题标题】:JNI function returning illegal UTF characters at androidJNI函数在android返回非法UTF字符
【发布时间】:2017-09-12 23:25:30
【问题描述】:

我试图将字符串从 JNI 返回到 android,但它返回的非法 UTF 字符如下:

JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8:
illegal start byte 0x80
04-12 16:08:09.899 18210-18372 A/art:art/runtime/runtime.cc:427]
string: '���� ���!��"��,"���"���#���$��%���
%��`&��'��H(���)��D*���*��X+��,���,���-��4.��|.��P/��t/���/��01��x1��
2��D2���2���3���4���5��06���6��9���9��;���;��H<��=��0=���=���>��8?��

这是我正在使用的代码:

JNIEXPORT jbyteArray Java_pakdata_com_qurantextc_MainActivity_get(
    JNIEnv *pEnv,
    jobject this,
    jint pageNo, jint lang) {


char* buffer=(char*)malloc(10000);  // this buffer contains the ayat
register unsigned int pageNumber = pageNo - 1;

char * header=(char*)malloc(1000);
sprintf(header,"[{\"OFFSET\":%d,\"DATA\":\"",pageNumber+1);
strcpy(buffer,header);

// to get the last ayat of the page
// this loop will fetch all ayats of the page

for (int i = start_ayat; i <= end_ayat; i++) {



sprintf(buffer+strlen(buffer),"<div class=\\\"qr0\\\" data-ayat=\\\"%d\\\" id=\"%d\\\"><span>",i+1,i+1);
get(lang, i, buffer + strlen(buffer)); // len is equal to length of buffer (   strlen()  )
        strcpy(buffer+strlen(buffer),"<\\/span><\\/div>");


}
  // char* footer;
sprintf(buffer+strlen(buffer),"<div class=\\\"pagebreak\">%d<a id=\\\"%d\\\"next\\\"href=\\\"\\/page\\/%d\\\"></a><\\/div <\\/div>\"}]",pageNumber+1,pageNumber+1,pageNumber+1);

__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG","string: '%s'" , buffer);
int l = strlen(buffer);
char c[l];
strcpy(c,replace(buffer,"\r","<br>"));

jbyteArray ret = (*pEnv)->NewByteArray(pEnv,l);
(*pEnv)->SetByteArrayRegion (pEnv,ret, 0, l, c);
const char * errorKind = NULL;
uint8_t utf8 = checkUtfytes(c, &errorKind);
if  (errorKind != NULL) {
    free(buffer);
    return ret;

} else {
    free(buffer);
    return ret;
}

我也试过用这个:

return = (*pEnv)->NewStringUTF(pEnv,buffer)

但它仍然包含非法 UTF 字符..

这是我的安卓端代码

byte[] ss = get(a, pos);
s= new String(ss,"UTF-8");

仍然收到非法 UTF 字符错误。 我曾尝试在 java 端进行编码,但也无济于事, 我在这里发帖是因为我已经尝试过这里写的所有其他方法,但没有奏效。

请帮忙!!!

【问题讨论】:

  • 坦率地说,your code smells。您正在将字符串与strcpy() 连接起来,而不管您复制了多少字节——这些调用很可能会超出分配的内存。这个调用溢出它的内存:strcpy(c,replace(buffer,"\r","&lt;br&gt;"));,因为你使用缓冲区的原始长度来创建一个新的缓冲区c[l],但是忘记为终止NUL字符创建足够的空间,并且然后通过调用replace() 使字符串更长。而且一旦出现内存损坏,JNI 很可能会崩溃。
  • 你是对的...有什么解决办法吗?
  • @AndrewHenle:虽然您说的是真的,但根据日志消息,看起来数据甚至在replace() 溢出发生之前就已损坏。除非checkUtfytes() 内部有另一个 JNI 调用,但实际发生故障的地方。

标签: c encoding utf-8 android-ndk java-native-interface


【解决方案1】:

可能是我迟到了,但您的代码似乎是正确的,但根据 JNI 文档,它们不支持这些字符。您必须从服务器端处理它。希望对您有所帮助。

【讨论】:

  • 是的,你是对的。这是问题之一。所以我标记你的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多