1

我的 JNI 代码char* src从外部源接收 a ,将其转换为Stringusing 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块。

注意:问题的重点是捕获异常(并通过控制其影响,因此它不会使应用程序崩溃),而不一定要解决它(尽管它可能有用)。

我正在使用带有 NDK v15.2 的 Android Studio v2.3.3(最新版本)。

你的帮助将非常有义务。

4

1 回答 1

1

文本日期类型用于文本。

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

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

文本的字符编码是什么?

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

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

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

于 2017-09-04T22:10:26.193 回答