【问题标题】:JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf0JNI检测到应用程序错误:输入无效修改UTF-8:非法起始字节0xf0
【发布时间】:2020-03-23 15:48:12
【问题描述】:

我的应用程序崩溃了,logcat 显示这个"" JNI DETECTED ERROR IN APPLICATION: input is not valid Modified 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] 在调用 NewStringUTF 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] | group="main" 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 nice=0 cgrp=default sched=0/0 handle=0xf4923080 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | state=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 堆栈大小=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] native: #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(回溯: :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] native: #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] native: #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/艺术:sart/runtime/check_jni.cc:65] 本机:#04 pc 000b6d7b /system/lib/libart.so(艺术: :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] native: #05 pc 000b74a1 /system/lib/libart.so (art: :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] native: #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/艺术:sart/runtime/check_jni.cc:65] 本机:#07 pc 000c3545 /system/lib/libart.so(艺术: :CheckJNI::NewStringUTF(_JNIEnv*, char const*)+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: sart/runtime/check_jni.cc:65] 本机: #11 pc 00a7a383 /data/dalvik-cache/arm/data@ app@org.aitech.ai.debug-1@base.apk@classes.dex (Java_org_videolan_medialibrary_MedialibraryImpl_nativeGetSortedPagedAudio__IZII+110) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.medialibrary.MedialibraryImpl.nativeGetSortedPagedAudio(本机方法) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.medialibrary.MedialibraryImpl.getPagedAudio(MedialibraryImpl.java:194) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.TracksProvider.getPage(TracksProvider.吨:63) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.TracksProvider.getPage(TracksProvider.吨:33) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.MedialibraryProvider$MLDataSource.loadInitial( MedialibraryProvider.kt:127) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PositionalDataSource.dispatchLoadInitial(PositionalDataSource.java:362) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.TiledPagedList.(TiledPagedList.java:112) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PagedList.create(PagedList.java:452) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PagedList$Builder.build(PagedList.java:611) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:202) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:167) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 587) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.lang.Thread.run(Thread.java:818) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 03-19 10:39:29.491 25489-25517/org.aitech.ai .debug A/art: sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified 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] 在调用 NewStringUTF 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] | group="main" 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 nice=0 cgrp=default sched=0/0 handle=0xf4923080 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | state=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 堆栈大小=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] native: #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(回溯: :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] native: #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] native: #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/艺术:sart/runtime/check_jni.cc:65] 本机:#04 pc 000b6d7b /system/lib/libart.so(艺术: :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] native: #05 pc 000b74a1 /system/lib/libart.so (art: :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] native: #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/艺术:sart/runtime/check_jni.cc:65] 本机:#07 pc 000c3545 /system/lib/libart.so(艺术: :CheckJNI::NewStringUTF(_JNIEnv*, char const*)+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: sart/runtime/check_jni.cc:65] 本机: #11 pc 00a7a383 /data/dalvik-cache/arm/data@ app@org.aitech.ai.debug-1@base.apk@classes.dex (Java_org_videolan_medialibrary_MedialibraryImpl_nativeGetSortedPagedAudio__IZII+110) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.medialibrary.MedialibraryImpl.nativeGetSortedPagedAudio(本机方法) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.medialibrary.MedialibraryImpl.getPagedAudio(MedialibraryImpl.java:194) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.TracksProvider.getPage(TracksProvider.吨:63) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.TracksProvider.getPage(TracksProvider.吨:33) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 org.aitech.ai.providers.medialibrary.MedialibraryProvider$MLDataSource.loadInitial( MedialibraryProvider.kt:127) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PositionalDataSource.dispatchLoadInitial(PositionalDataSource.java:362) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.TiledPagedList.(TiledPagedList.java:112) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PagedList.create(PagedList.java:452) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.PagedList$Builder.build(PagedList.java:611) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:202) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:167) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 587) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 在 java.lang.Thread.run(Thread.java:818) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] """""""""""""'

【问题讨论】:

  • 触发此错误的代码行是什么?
  • 听起来你在任意二进制字符串上使用了NewStringUTF
  • 是的,我使用过 NewStringUTF,当文件名中有表情符号时会导致错误

标签: android-ndk java-native-interface


【解决方案1】:

? 字符是 U+1F609 WINKING FACE。

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

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

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

抄袭my answer here,我们将做相当于
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多