关于:JNI WARNING: illegal start byte 处理

原创 2011年01月24日 14:24:00

W/dalvikvm( 1473): JNI WARNING: illegal start byte 0xfb
W/dalvikvm( 1473):              string: '' 大宦飞懧?
W/dalvikvm( 1473):              in Landroid/media/MediaScanner;.processFile (Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V (NewStringUTF)
I/dalvikvm( 1473): "MediaScannerService" prio=5 tid=10 NATIVE
I/dalvikvm( 1473):   | group="main" sCount=0 dsCount=0 s=N obj=0x45f1ea18 self=0x22f0d0
I/dalvikvm( 1473):   | sysTid=1647 nice=11 sched=3/0 cgrp=unknown handle=2229456
I/dalvikvm( 1473):   at android.media.MediaScanner.processFile(Native Method)
I/dalvikvm( 1473):   at android.media.MediaScanner.access$500(MediaScanner.java:103)
I/dalvikvm( 1473):   at android.media.MediaScanner$MyMediaScannerClient.doScanFile(MediaScanner.java:565)
I/dalvikvm( 1473):   at android.media.MediaScanner$MyMediaScannerClient.scanFile(MediaScanner.java:497)
I/dalvikvm( 1473):   at android.media.MediaScanner.processDirectory(Native Method)
I/dalvikvm( 1473):   at android.media.MediaScanner.scanDirectories(MediaScanner.java:1275)
I/dalvikvm( 1473):   at com.android.providers.media.MediaScannerService.scan(MediaScannerService.java:111)
I/dalvikvm( 1473):   at com.android.providers.media.MediaScannerService.access$200(MediaScannerService.java:48)
I/dalvikvm( 1473):   at com.android.providers.media.MediaScannerService$ServiceHandler.handleMessage(MediaScannerService.java:268)
I/dalvikvm( 1473):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm( 1473):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm( 1473):   at com.android.providers.media.MediaScannerService.run(MediaScannerService.java:188)
I/dalvikvm( 1473):   at java.lang.Thread.run(Thread.java:1096)
I/dalvikvm( 1473):
E/dalvikvm( 1473): VM aborting

 

 

造成该问题的原因是没有通过虚拟机的checkjni检查。代码在dalvik/vm/CheckJni.c

 

/*
 * Verify that "bytes" points to valid "modified UTF-8" data.
 */
static void checkUtfString(JNIEnv* env, const char* bytes, bool nullOk,
    const char* func)
{
    const char* origBytes = bytes;

    if (bytes == NULL) {
        if (!nullOk) {
            LOGW("JNI WARNING: unexpectedly null UTF string/n");
            goto fail;
        }

        return;
    }

    while (*bytes != '/0') {
        u1 utf8 = *(bytes++);
        // Switch on the high four bits.
        switch (utf8 >> 4) {
            case 0x00:
            case 0x01:
            case 0x02:
            case 0x03:
            case 0x04:
            case 0x05:
            case 0x06:
            case 0x07: {
                // Bit pattern 0xxx. No need for any extra bytes.
                break;
            }
            case 0x08:
            case 0x09:
            case 0x0a:
            case 0x0b:
            case 0x0f: {
                /*
                 * Bit pattern 10xx or 1111, which are illegal start bytes.
                 * Note: 1111 is valid for normal UTF-8, but not the
                 * modified UTF-8 used here.
                 */
                LOGW("JNI WARNING: illegal start byte 0x%x/n", utf8);
                goto fail;
            }
            case 0x0e: {
                // Bit pattern 1110, so there are two additional bytes.
                utf8 = *(bytes++);
                if ((utf8 & 0xc0) != 0x80) {
                    LOGW("JNI WARNING: illegal continuation byte 0x%x/n", utf8);
                    goto fail;
                }
                // Fall through to take care of the final byte.
            }
            case 0x0c:
            case 0x0d: {
                // Bit pattern 110x, so there is one additional byte.
                utf8 = *(bytes++);
                if ((utf8 & 0xc0) != 0x80) {
                    LOGW("JNI WARNING: illegal continuation byte 0x%x/n", utf8);
                    goto fail;
                }
                break;
            }
        }
    }

    return;

fail:
    LOGW("             string: '%s'/n", origBytes);
    showLocation(dvmGetCurrentJNIMethod(), func);
    abortMaybe();
}

 

解决方法:

是否进行checkjni检查是由ro.kernel.android.checkjni决定。

在eng版本中ro.kernel.android.checkjni=1.而在user版本不做检查。

 

关于:JNI WARNING: illegal start byte 处理

W/dalvikvm( 1473):              in Landroid/media/MediaScanner;.processFile (Ljava/lang/St...
  • dkxatt
  • dkxatt
  • 2011年06月17日 01:11
  • 2106

那些年Android开发遇到的坑(JNI 之 Illegal start byte 0xfe)

公司构建了自己的推送系统,我们的app的推送也有极光推送改为了自己的推送。在使用我们自己的推送的过程中,推送纯文字一切正常,但如果推送内容中含有特殊表情(比如这样的 ),在一部分Android机器(红...

input is not valid Modified UTF-8: illegal start byte 0x**

扫描一个视频时,视频的文件信息中,标题是乱码,导致表面上的重启,具体出错信息为: W/dalvikvm(17090): JNI WARNING: input is not valid Modif...

Python中读取txt文本出现“ 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence”的解决办法

今天,练习一个通过读取txt文本信息(英文版的Walden.txt),统计文本中的英文单词词频。在读取Walden.txt文本时,出现了“UnicodeDecodeError: 'gbk' codec...

Warning session_start

  • 2011年11月03日 19:00
  • 1KB
  • 下载

Warning: session_start() [function.session-start]: Cannot send session cache limiter

今天在配置php网站的时候,经常会在页首出现Warning: session_start() [function.session-start]: Cannot send session cache l...
  • lasig
  • lasig
  • 2011年12月21日 13:21
  • 8050

Jni Byte数组传递异常

JNI jbyteArray jobjectArray Crash pin count is 1024 JNI:pin count on array 0x... ([B) ReleaseByteArr...
  • sz66cm
  • sz66cm
  • 2016年11月04日 11:11
  • 968

ioS开发--Warning警告处理

去除警告的方法: #pragma clang diagnostic push #pragma clang diagnostic ignored"-Wunused-function" local vo...

引入sleak异常,Warning: Device is not tracking resource allocation处理

引入sleak异常,Warning: Device is not tracking resource allocation处理

iOS中如何处理memory warning

在iOS6.0之前,当应用程序收到memory warning时,会调用: UIApplication::didReceiveMemoryWarning -> UIApplicationDele...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于:JNI WARNING: illegal start byte 处理
举报原因:
原因补充:

(最多只允许输入30个字)