C JNI函数在android上返回非法UTF字符

C JNI函数在android上返回非法UTF字符,c,encoding,utf-8,android-ndk,java-native-interface,C,Encoding,Utf 8,Android Ndk,Java Native Interface,我试图将字符串从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: '���� ���!��"��,"���"���#���$��%��� %��`&

我试图将字符串从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?��
但它仍然包含非法的UTF字符

这是我的android端代码

byte[] ss = get(a, pos);
s= new String(ss,"UTF-8");
仍然获取非法的UTF字符错误。 我尝试过在java端编码,但也没有帮助, 我之所以在这里发帖,是因为这里写的所有其他方法我都已经尝试过了,但都不起作用


请帮忙

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

坦率地说。您将字符串与
strcpy()
连接起来,而不考虑您复制了多少字节-这些调用很可能会超出分配的内存。此调用将溢出其内存:
strcpy(c,replace(buffer),“\r”,“
”)
因为您使用缓冲区的原始长度创建新缓冲区
c[l]
,但忘记为终止的
NUL
字符创建足够的空间,然后通过调用
replace()
使字符串更长。一旦内存损坏,JNI很可能会崩溃。你是对的。。。有什么解决方案吗?@AndrewHenle:根据日志消息,您所说的是正确的,但看起来数据在
replace()
溢出发生之前就已经损坏了。除非
checkUtfytes()
中有另一个发生实际故障的JNI调用。是的,您是对的。。这是一个问题。所以我认为你的答案是正确的。
return = (*pEnv)->NewStringUTF(pEnv,buffer)
byte[] ss = get(a, pos);
s= new String(ss,"UTF-8");