JNI:捕获NewStringUTF内部异常

问题描述:

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

一些输入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(最新的日期)。

    您的援助将是非常有义务的。

    +0

    这个例外是告诉你,你的假设是不正确的。 –

    +0

    也许没有被强调,但问题集中在**捕捉异常**(并通过控制其影响,所以它不会使应用程序崩溃),而不一定是解决它。可能是因为'NewStringUTF'中执行的低级代码导致崩溃? – Bliss

    +1

    文档说,如果构建字符串时出现错误,NewStringUTF将返回NULL。所以也许这就是它的全部原因:检查NULL并忽略除你以外没有人会看到的调试输出 – user2543253

    文本日期类型用于文本。

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

    没有文本,但没有编码文本。

    什么是文本的字符编码?

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

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

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