java - 使用 Jackson 解析器时 Android verifyError 崩溃

标签 java android eclipse jar

这是我的日志猫。不幸的是,我不是从 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;
 }


}

最佳答案

关键问题就在这里

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;

一切都从那里开始走下坡路。

看起来 JsonParseException (以及可能来自 Jackson 的其他类)未包含在您的 APK 中。如果 Eclipse 未导出它们,则可能会发生这种情况。

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

关于java - 使用 Jackson 解析器时 Android verifyError 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959209/

相关文章:

java - 继承和多态分配

android - 从另一个应用程序调用 Activity

java - 从不同的插件访问资源包

java - Eclipse Java 项目中的长文件夹路径是否有解决方法?

Java编程: Integer value to Hexadecimal

java - 从java调用ant,ant终止后返回java

java - Fragment 无法从 ViewModel 获取值

android - 如何在 LinearList View 中存储组单选按钮的状态

java - 正在寻找一个真正好的地方来学习一些直接的 Java 和 'abstract' 概念来帮助 Android!完整的Java初学者:)

java - 使 JDBC 插入查询更快