16

I added the commons codec from apache.org (commons-codec-1.4.jar) in eclipse for my Android application following the instruction here. There is no error in the code. But when I run the application and call the function that use the codec the application stop and need a fore close.

In the logCat says:

Android Runtime: java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String

the codeline is: String tmpStr = Base64.encodeBase64String(msg); //msg is a byte[]

The application is for a min SDK version = 7 (Android 2.1), so I can't use Android Base64

Any idea how can I solve the problem?

Community
  • 1
  • 1
DVV
  • 161
  • 1
  • 1
  • 3
  • 2
    Analyzing the LogCat before the runtime error says: INFO/dalvikvm(292): Could not find method org.apache.commons.codec.binary.Base64.decodeBase64, referenced from method in package WARN/dalvikvm(292): VFY: unable to resolve static method 299: Lorg/apache/commons/codec/binary/Base64;.decodeBase64 (Ljava/lang/String;)[B – DVV Feb 28 '11 at 22:13
  • Consider this answer (using maven): http://stackoverflow.com/a/26548748/1084488 – Matthias Oct 24 '14 at 13:26

4 Answers4

8

I couldn't get the commons codec to run on a 2.1 emulator either. I gave up in the end and made my own, copying the code from:

Base64 encoder/decoder

It's only just over a hundred lines or so.

NickT
  • 23,844
  • 11
  • 78
  • 121
  • I decided to look for the source code of Android.util.Base64. I copied the code into a new java file called Base64.java. Then I added the file to my project under Android.util package. My application is working fine. But I don't think this is the best approach and how can this affect the application when is runing on Android API 8 or later, which contain this class? – DVV Mar 01 '11 at 19:39
8

I experienced the exact same problem. So i started browsing the android source code, and as it turns out Don's guess about Android having an implementation of org.apache.commons.code.binary is correct. he's wrong about the ability to access it, you can, but its version 1.2 of the apache commons, not version 1.4 or even 1.5. You can see for your self in the android source.

Also as a note, this question is a duplicate of this post.

Community
  • 1
  • 1
zarthross
  • 763
  • 6
  • 13
4

I think it has something to do with the name conflicts inside Android libraries.

I copied the java source code of Base64 to my project into the the namespace of org.apache.commons.codec.binary. The project compiled without any problem. However, at the runtime in Android simulator, I had the same error, java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String.

However, after I changed the namespace to com.apache.commons.codec.binary instead of org, the app runs like magic. I guess inside Android implementation, org.apache.commons.codec.binary is used and it doesn't allow you to use it in your code again.

Don
  • 221
  • 1
  • 3
0

The reason you are having an issue is because those instructions are wrong but there must be a different version of the commons-codec or Base64 class present.

My understanding is that you need to put your jar file into a 'libs' directory at the root of your project to ensure it ends up automatically inside the final apk. Once you put it there, right click the jar file and then go to Build Path-> Add to build path. Should work from there.

Nick Campion
  • 10,479
  • 3
  • 44
  • 58
  • I put the commons-codec-1.4.jar into a lib folder inside the folder of my application. I add the jar files as you mention but is the same situation. It run but when the application call the function where is using the codec it foreclose. The logCat is the same. – DVV Feb 28 '11 at 21:51
  • 1
    lib or libs? Its very important that it be `libs`. – Nick Campion Feb 28 '11 at 22:58
  • 1
    Sorry, my folder name is libs. But is the same. The LogCat before the runtime error have the following: 03-01 12:47:47.781: INFO/dalvikvm(264): Could not find method org.apache.commons.codec.binary.Base64.encodeBase64String, referenced from method dv.sample.and.msgtest.calc 03-01 12:47:47.781: WARN/dalvikvm(264): VFY: unable to resolve static method 311: Lorg/apache/commons/codec/binary/Base64;.encodeBase64String ([B)Ljava/lang/String; – DVV Mar 01 '11 at 17:50