JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法起始字节 0xf0

1 java-native-interface android-ndk

我的应用程序崩溃了,logcat 显示此信息"" JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法起始字节 0xf0""

logcat 显示了这一点

03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法启动字节 0xf0 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 字符串:


'ZA_SPEENA_JALLABI__YAMA_LALAI_ME_GHANAM__RANG_DE_(_BY_ARYANA_SAEED_) (128k).mp3' 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 调用 NewString 03- 19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 来自 org.aitech.medialibrary.interfaces.media.MediaWrapper[] org.aitech.medialibrary .MedialibraryImpl.nativeGetSortedPagedAudio(int, boolean, int, int) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] "arch_disk_io_1" prio =5 tid=20 可运行 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 组=“主”sCount=0 dsCount=0 obj=0x13054160 self=0xdd476000 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | sysTid=25517 好=0 cgrp=默认 sched=0/0 句柄=0xf4923080 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 状态=R schedstat=( 0 0 0 ) utm=10 stm=8 core=3 HZ=100 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni .cc:65] | 堆栈= 0xdccb7000-0xdccb9000 stackSize = 1036KB 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 持有互斥锁=“mutator lock”(共享持有)03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#00 pc 00004e64 /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext65]| 组=“主”sCount=0 dsCount=0 obj=0x13054160 self=0xdd476000 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | sysTid=25517 好=0 cgrp=默认 sched=0/0 句柄=0xf4923080 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 状态=R schedstat=( 0 0 0 ) utm=10 stm=8 core=3 HZ=100 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni .cc:65]| 堆栈= 0xdccb7000-0xdccb9000 stackSize = 1036KB 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 持有互斥锁=“mutator lock”(共享持有)03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#00 pc 00004e64 /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+23) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/ check_jni.cc:65]本机:#01 pc 00003665 /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+8) 03-19 10:39:29.491 25489-25517/org.aitech .ai.debug A/art: sart/runtime/check_jni.cc:65] 本机: #02 pc 0026bc55 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream >&, int, char const*, art::mirror::ArtMethod*)+84) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#03 pc 0024e367 /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream >&) const+158) 03-19 10:39:29.491 25489-25517/org. aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#04 pc 000b6d7b /system/lib/libart.so (art::JniAbort(char const*, char const*)+610) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#05 pc 000b74a1 /system/lib/libart.so (艺术: :JniAbortF(char const*, char const*, ...)+68) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65 ] 本机:#06 pc 000b9a5b /system/lib/libart.so (art::ScopedCheck::Check(bool, char const*, ...) (.constprop.129)+922) 03-19 10:39: 29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#07 pc 000c3545 /system/lib/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv *,字符常量*)+44) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#08 pc 000bc843 /data /app/org.aitech.ai.debug-1/lib/arm/libmla.so (mediaToMediaWrapper(_JNIEnv*, fields*, std::__ndk1::shared_ptr const&)+514) 03-19 10:39:29.491 25489 -25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#09 pc 000b27af /data/app/org.aitech.ai.debug-1/lib/arm/libmla .so (???) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 本机:#10 pc 000b28f7 /data/app /org.aitech.ai.debug-1/lib/arm/libmla.so (getPagedAudio(_JNIEnv*, _jobject*, int, unsigned char, int, int)+46) 03-19 10:39:29.491 25489-25517 /org.aitech.ai.debug A/art:

Bot*_*tje 6

该角色是 U+1F609 眨眼脸。

它的常规 UTF-8 编码是 f09f9889,与您的错误匹配。Java 需要Modified UTF-8,但是:

代码点高于 U+FFFF 的字符(所谓的增补字符)通过分别编码其 UTF-16 表示形式的两个代理代码单元来表示。每个代理代码单元由三个字节表示。这意味着,补充字符由六个字节表示:u、v、w、x、y 和 z。

您不能使用NewStringUTF此功能,您必须手动从 UTF-8 进行解码。

抄袭我在这里的答案,我们将做相当于
Charset.forName("UTF-8").decode(bb).toString()

const char * filename = /* what you have now */;
jobject bb = env->NewDirectByteBuffer(filename, strlen(filename));

jclass cls_Charset = env->FindClass("java/nio/charset/Charset");
jmethodID mid_Charset_forName = env->GetStaticMethodID(cls_Charset, "forName", "(Ljava/lang/String;)Ljava/nio/charset/Charset;");
jobject charset = env->CallStaticObjectMethod(cls_Charset, mid_Charset_forName, env->NewStringUTF("UTF-8"));

jmethodID mid_Charset_decode = env->GetMethodID(cls_Charset, "decode", "(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;");
jobject cb = env->CallObjectMethod(charset, mid_Charset_decode, bb);
env->DeleteLocalRef(bb);

jclass cls_CharBuffer = env->FindClass("java/nio/CharBuffer");
jmethodID mid_CharBuffer_toString = env->GetMethodID(cls_CharBuffer, "toString", "()Ljava/lang/String;");
jstring str = env->CallObjectMethod(cb, mid_CharBuffer_toString);
// Do something with str
Run Code Online (Sandbox Code Playgroud)