我的JNI代码从外部来源接收到char* src
,并使用String
将其转换为jstring jStr = env->NewStringUTF(src)
,并将结果jStr
传递到上层Java层。
某些输入src
值导致以下运行时错误(在NewStringUTF
的调用内):
A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf8
A/art: art/runtime/java_vm_ext.cc:470] string: 'radio abcdefg ���� ����� ��� ����'
A/art: art/runtime/java_vm_ext.cc:470] input: '0x72 0x61 0x64 0x69 0x6f 0x20 0x62 0x72 0x65 0x73 0x6c 0x65 0x76 0x20 <0xf8> 0xe3 0xe9 0xe5 0x20 0xe1 0xf8 0xf1 0xec 0xe1 0x20 0xf7 0xe5 0xec 0x20 0xe4 0xf0 0xe7 0xec'
A/art: art/runtime/java_vm_ext.cc:470] in call to NewStringUTF
我使用的所有方法都无法“捕获”此NewStringUTF错误/异常:
在
if (env->ExceptionCheck() == JNI_TRUE)
调用后放置NewStringUTF
。在
if (env->ExceptionOccurred())
调用后放置NewStringUTF
。用
NewStringUTF
块将调用绑定到try...catch
。注意:问题的重点在于捕获异常(并通过控制异常的影响,因此不会使应用程序崩溃),而不一定要解决该问题(尽管它可能很有用)。
我正在将Android Studio v2.3.3与NDK v15.2一起使用(最新)。
您的协助将非常有必要。
最佳答案
文本日期类型用于文本。
数据是否通过char *
文本传递?
没有文字,只有编码文字。
文字的字符编码是什么?
NewStringUTF:根据修改后的UTF-8编码的字符数组构造一个新的java.lang.String对象。
Android文字通常是标准的UTF-8。看起来像Windows-1255(希伯来语),但只有作者可以说。
无论如何,解决方案都是使用Java字符编码功能将编码后的文本从字节数组转换为Java字符串(UTF-16)。在Java中调用此类方法要比通过JNI调用起来容易。因此,如果适合您的数据流,请将char *
复制到jbyteArray并将其传递回Java,在Java中可以使用相关编码轻松将其转换为文本数据类型。