【问题标题】:Android VerifyError crash using jackson parser使用杰克逊解析器的 Android VerifyError 崩溃
【发布时间】:2014-07-20 11:39:34
【问题描述】:

这是我的日志猫。不幸的是,我不是从 logcat 读取错误的专家,所以请帮助我:)

05-30 12:12:16.510: I/System.out(838):  We made it this far 1
05-30 12:12:17.230: I/System.out(838):  We made it this far 2
05-30 12:12:17.240: W/dalvikvm(838): VFY: unable to resolve exception class 748 (Lcom/fasterxml/jackson/core/JsonParseException;)
05-30 12:12:17.240: W/dalvikvm(838): VFY: unable to find exception handler at addr 0x2a
05-30 12:12:17.240: W/dalvikvm(838): VFY:  rejected Lcom/example/bitmapdisplay/MainActivity$URLArray;.doInBackground ([Ljava/lang/Void;)Ljava/lang/Void;
05-30 12:12:17.240: W/dalvikvm(838): VFY:  rejecting opcode 0x0d at 0x002a
05-30 12:12:17.250: W/dalvikvm(838): VFY:  rejected Lcom/example/bitmapdisplay/MainActivity$URLArray;.doInBackground ([Ljava/lang/Void;)Ljava/lang/Void;
05-30 12:12:17.250: W/dalvikvm(838): Verifier rejected class Lcom/example/bitmapdisplay/MainActivity$URLArray;
05-30 12:12:17.250: D/AndroidRuntime(838): Shutting down VM
05-30 12:12:17.250: W/dalvikvm(838): threadid=1: thread exiting with uncaught exception (group=0xb1adaba8)
05-30 12:12:17.270: E/AndroidRuntime(838): FATAL EXCEPTION: main
05-30 12:12:17.270: E/AndroidRuntime(838): Process: com.example.bitmapdisplay, PID: 838
05-30 12:12:17.270: E/AndroidRuntime(838): java.lang.VerifyError: com/example/bitmapdisplay/MainActivity$URLArray
05-30 12:12:17.270: E/AndroidRuntime(838):  at com.example.bitmapdisplay.MainActivity.onCreate(MainActivity.java:72)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.Activity.performCreate(Activity.java:5231)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.os.Handler.dispatchMessage(Handler.java:102)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.os.Looper.loop(Looper.java:136)
05-30 12:12:17.270: E/AndroidRuntime(838):  at android.app.ActivityThread.main(ActivityThread.java:5017)
05-30 12:12:17.270: E/AndroidRuntime(838):  at java.lang.reflect.Method.invokeNative(Native Method)
05-30 12:12:17.270: E/AndroidRuntime(838):  at java.lang.reflect.Method.invoke(Method.java:515)
05-30 12:12:17.270: E/AndroidRuntime(838):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-30 12:12:17.270: E/AndroidRuntime(838):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-30 12:12:17.270: E/AndroidRuntime(838):  at dalvik.system.NativeStart.main(Native Method)
05-30 12:12:30.390: I/Process(838): Sending signal. PID: 838 SIG: 9

这是 logcat 代码,这是我的 Java 代码。似乎问题来自线程 URLArray,因为从 logcat 中可以看出,系统甚至没有打印第三个“我们做到了这一点”:

package com.example.bitmapdisplay;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.fasterxml.jackson.core.JsonParseException;

import android.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;


public class MainActivity extends Activity {

    /**
     * Bitmap items na dimage displaying
     */
    Bitmap image;
    BitmapDrawable bd;
    ImageView temp;
    ProgressDialog pd;

    /**
     * JSON URL
     */
    URL url;

    /**
     * Data from JSON file
     */
    ArrayList<String> urls;
    ArrayList<ImageView> images;

    JsonParsing obj;

    String json_link_str = "http://api.tumblr.com/v2/blog/humansofnewyork.com/posts?api_key=7ag2CJXOuxuW3vlVS5wQG6pYA6a2ZQcSCjzZsAp2pDbVwf3xEk&notes_info=true&filter=text";
    int counter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        System.out.println(" We made it this far 1");
        super.onCreate(savedInstanceState);
        setContentView(com.example.bitmapdisplay.R.layout.image_container);

        counter = 0;
        images = new ArrayList<ImageView>();
        urls = new ArrayList<String>();

        System.out.println(" We made it this far 2");

        new URLArray().execute();


    }

    /**
     * Fills the ListView
     */
    private void fillGridView() {

        ArrayAdapter<ImageView> adapter = new ArrayAdapter<ImageView>(this, com.example.bitmapdisplay.R.layout.image_container,images);

        GridView grid = (GridView) findViewById(com.example.bitmapdisplay.R.id.gvImages);

        grid.setAdapter(adapter);

    }

    public class URLArray extends AsyncTask<Void, Void, Void                                                                                                                                         > {

        public URLArray() {

        }

        @Override
        protected Void doInBackground(Void...params ) {
            try {
                System.out.println(" We made it this far 3");

                URL json_link = new URL(json_link_str);

                JsonParsing parse_images = new JsonParsing(json_link);

                    try {
                        parse_images.parseFile(3, urls);
                        System.out.println(" We made it this far 4");

                    } catch (JsonParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    obj = parse_images;
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void arg) {
            super.onPreExecute();
            System.out.println(" We made it this far 5");

            urls = obj.getURLs();
            new TheTask().execute();
        }

    }


class TheTask extends AsyncTask<Void,Void,Void>
{


    @Override
    protected Void doInBackground(Void... params) {

        System.out.println(" We made it this far 6");

        pd = new ProgressDialog(MainActivity .this);
        pd.show();


        System.out.println(" We made it this far 7");

        try
        {
            int counter = 0;
        for (ImageView temp : images) {

            image = downloadBitmap(urls.get(counter));
            temp.setImageBitmap(image);
            images.add(temp);
            counter++;
        }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        System.out.println(" We made it this far 8");

        super.onPostExecute(result);
        pd.dismiss();
        if(image!=null)
        {
            fillGridView();
        }

    }   
}
 private Bitmap downloadBitmap(String url) {
     // initilize the default HTTP client object
     final DefaultHttpClient client = new DefaultHttpClient();

     //forming a HttoGet request 
     final HttpGet getRequest = new HttpGet(url);
     try {

         HttpResponse response = client.execute(getRequest);

         //check 200 OK for success
         final int statusCode = response.getStatusLine().getStatusCode();

         if (statusCode != HttpStatus.SC_OK) {
             Log.w("ImageDownloader", "Error " + statusCode + 
                     " while retrieving bitmap from " + url);
             return null;

         }

         final HttpEntity entity = response.getEntity();
         if (entity != null) {
             InputStream inputStream = null;
             try {
                 // getting contents from the stream 
                 inputStream = entity.getContent();

                 // decoding stream data back into image Bitmap that android understands
                 image = BitmapFactory.decodeStream(inputStream);


             } finally {
                 if (inputStream != null) {
                     inputStream.close();
                 }
                 entity.consumeContent();
             }
         }
     } catch (Exception e) {
         // You Could provide a more explicit error message for IOException
         getRequest.abort();
         Log.e("ImageDownloader", "Something went wrong while" +
                 " retrieving bitmap from " + url + e.toString());
     } 

     return image;
 }


}

【问题讨论】:

  • 为什么会有空的URLArray() 构造函数?如果你把它拿出来会发生什么?
  • 运行时加载JsonParseException类时出现问题。请参阅stackoverflow.com/questions/100107/… 了解可能的原因。您很可能使用了错误版本的库。
  • @AdamJohns 我改变了它。没有区别:/
  • @matiash 我明白了。但是,我将在哪里更改运行时的库?对不起,我不擅长使用 logcat 来确定问题的确切位置和包。
  • 问题可能与用作库的 jar 有关。请参阅stackoverflow.com/questions/6247862/… 了解可能的解决方案

标签: java android eclipse jar


【解决方案1】:

关键问题在这里

05-30 12:12:17.240: W/dalvikvm(838): VFY: unable to resolve exception class 748 (Lcom/fasterxml/jackson/core/JsonParseException;)
05-30 12:12:17.240: W/dalvikvm(838): VFY: unable to find exception handler at addr 0x2a
05-30 12:12:17.240: W/dalvikvm(838): VFY:  rejected Lcom/example/bitmapdisplay/MainActivity$URLArray;.doInBackground ([Ljava/lang/Void;)Ljava/lang/Void;
05-30 12:12:17.240: W/dalvikvm(838): VFY:  rejecting opcode 0x0d at 0x002a
05-30 12:12:17.250: W/dalvikvm(838): VFY:  rejected Lcom/example/bitmapdisplay/MainActivity$URLArray;.doInBackground ([Ljava/lang/Void;)Ljava/lang/Void;
05-30 12:12:17.250: W/dalvikvm(838): Verifier rejected class Lcom/example/bitmapdisplay/MainActivity$URLArray;

一切都从那里走下坡路。

您的 APK 中似乎没有包含 JsonParseException(可能还有来自 Jackson 的其他类)。如果 Eclipse 没有导出它们,则可能会发生这种情况。

不要将其添加为外部库,只需将 jackson-core-x.x.x.jar 放在您的 Android 项目的 libs 文件夹中,就足以确保这一点。

【讨论】:

  • 我应该用我所有的包裹还是只用杰克逊的包裹?
  • 所有的罐子都应该放在那里。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2021-11-01
  • 2019-11-25
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多