JNI:捕获NewStringUTF内部异常

时间:2017-09-04 18:19:47

标签: android android-ndk java-native-interface jnienv

我的JNI代码从外部源收到char* src,使用String将其转换为jstring jStr = env->NewStringUTF(src),并将结果jStr传递给上层Java层。 / p>

某些输入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

我使用的所有方法都没有&#34;赶上&#34;这个 NewStringUTF 错误/异常:

  • if (env->ExceptionCheck() == JNI_TRUE)来电后放置NewStringUTF
  • if (env->ExceptionOccurred())来电后放置NewStringUTF
  • 通过NewStringUTF阻止对try...catch的调用。

注意:问题集中在捕获异常(并通过控制其影响,因此它不会使应用程序崩溃),而不一定解决它(虽然它可能有用)。

我使用Android Studio v2.3.3和NDK v15.2(迄今为止最新)。

您的帮助非常有用。

1 个答案:

答案 0 :(得分:1)

  

文本日期类型用于文本。

数据是通过char *文字传递的吗?

  

没有文字,只有编码文字。

文本的字符编码是什么?

  

NewStringUTF:从修改后的UTF-8编码中的字符数组构造一个新的java.lang.String对象。

Android文字往往是标准的UTF-8。这看起来像Windows-1255(希伯来语),但只有作者可以说。

无论如何,解决方案是使用Java字符编码函数将编码文本从字节数组转换为Java字符串(UTF-16)。在Java中调用此类方法比通过JNI更容易。因此,如果它适合您的数据流,请将char *复制到jbyteArray并将其传递回Java,在Java中可以使用相关编码将其轻松转换为文本数据类型。