Search code examples
javaandroidid3id3-tag

JAudiotagger java.lang.VerifyError in android


I am trying to create an audio tag editor refering to these

http://www.jthink.net/jaudiotagger/

and

JAudioTagger and Android - Change a value in an mp3?

and

Jaudiotagger ID3 TAG for android - can set artwork but cannot set other fields

which library is needed to be imported in to the project so that I donot get java.lang.VerifyError

I am trying the code with this library

jaudiotagger-2.2.5.jar

which I Found from here

https://bitbucket.org/ijabz/jaudiotagger/downloads

this is the code

try {
    File file = new File(Data);
    TagOptionSingleton.getInstance().setAndroid(true);
    AudioFile audioFile = AudioFileIO.read(file);
    Tag newTag = audioFile.getTag();
    newTag.setField(FieldKey.ALBUM,"October");
    newTag.setField(FieldKey.ARTIST,"U2");
    audioFile.commit(); 
} catch (CannotReadException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (TagException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ReadOnlyFileException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InvalidAudioFrameException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (CannotWriteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

this is the log cat

12-07 16:56:10.618: D/dalvikvm(738): GC_FOR_ALLOC freed 137K, 11% free 6210K/6919K, paused 59ms
12-07 16:56:11.358: I/dalvikvm(738): Could not find method org.jaudiotagger.tag.TagOptionSingleton.getInstance, referenced from method com.example.scrlltabs3.songManagerDialog$3.onClick
12-07 16:56:11.358: W/dalvikvm(738): VFY: unable to resolve static method 11628: Lorg/jaudiotagger/tag/TagOptionSingleton;.getInstance ()Lorg/jaudiotagger/tag/TagOptionSingleton;
12-07 16:56:11.368: D/dalvikvm(738): VFY: replacing opcode 0x71 at 0x0009
12-07 16:56:11.368: W/dalvikvm(738): VFY: unable to resolve exception class 1667 (Lorg/jaudiotagger/audio/exceptions/CannotReadException;)
12-07 16:56:11.378: W/dalvikvm(738): VFY: unable to find exception handler at addr 0x2b
12-07 16:56:11.378: W/dalvikvm(738): VFY:  rejected Lcom/example/scrlltabs3/songManagerDialog$3;.onClick (Landroid/view/View;)V
12-07 16:56:11.378: W/dalvikvm(738): VFY:  rejecting opcode 0x0d at 0x002b
12-07 16:56:11.388: W/dalvikvm(738): VFY:  rejected Lcom/example/scrlltabs3/songManagerDialog$3;.onClick (Landroid/view/View;)V
12-07 16:56:11.388: W/dalvikvm(738): Verifier rejected class Lcom/example/scrlltabs3/songManagerDialog$3;
12-07 16:56:11.388: D/AndroidRuntime(738): Shutting down VM
12-07 16:56:11.398: W/dalvikvm(738): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
12-07 16:56:11.428: E/AndroidRuntime(738): FATAL EXCEPTION: main
12-07 16:56:11.428: E/AndroidRuntime(738): java.lang.VerifyError: com/example/scrlltabs3/songManagerDialog$3
12-07 16:56:11.428: E/AndroidRuntime(738):  at com.example.scrlltabs3.songManagerDialog.onCreate(songManagerDialog.java:68)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.Activity.performCreate(Activity.java:4465)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.os.Looper.loop(Looper.java:137)
12-07 16:56:11.428: E/AndroidRuntime(738):  at android.app.ActivityThread.main(ActivityThread.java:4340)
12-07 16:56:11.428: E/AndroidRuntime(738):  at java.lang.reflect.Method.invokeNative(Native Method)
12-07 16:56:11.428: E/AndroidRuntime(738):  at java.lang.reflect.Method.invoke(Method.java:511)
12-07 16:56:11.428: E/AndroidRuntime(738):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-07 16:56:11.428: E/AndroidRuntime(738):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-07 16:56:11.428: E/AndroidRuntime(738):  at dalvik.system.NativeStart.main(Native Method)

Solution

  • Reading the error, it is easy to point out that the following line is causing the Verify error

    TagOptionSingleton.getInstance().setAndroid(true);
    

    Could not find method org.jaudiotagger.tag.TagOptionSingleton.getInstance, referenced from method com.example.scrlltabs3.songManagerDialog$3.onClick

    Googling the issue I came across the following stackoverflow question/answer that describes the same issue and offers a solution by replacing:

    audioFile.commit(); 
    

    with

    AudioFileIO.write(audioFile)
    

    See here the question and with above solution. If this resolved your issue then don't forget to give the answerer Paul Taylor in that answer an upvote.

    java.lang.verifyError happens when JVM's bytecode verifier try to verify all the byte code before execution and fail when it finds inconsistencies and these inconsistencies can rise due to many factors such as

    • Compiling against one library and using a different one during run time
    • Individual compilation of class that have other classes depend on it
    • Others listed in the link to tutorial

    A detailed explanation about the VerifyError with examples can be found here.

    See the examples in the above link which demonstrate how verify error is thrown by JVM.