NoSuchMethodError using commonc codec in Android application
Asked Answered
N

4

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?

Nathanaelnathanial answered 28/2, 2011 at 21:29 Comment(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;)[BNathanaelnathanial
Consider this answer (using maven): https://mcmap.net/q/55588/-how-to-resolve-a-library-conflict-apache-commons-codecRapscallion
L
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.

Landsknecht answered 28/2, 2011 at 23:16 Comment(1)
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?Nathanaelnathanial
C
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.

Coomb answered 5/5, 2011 at 18:7 Comment(2)
First link "source" is broken :XSeashore
To add, a simple workaround is to refactor the commons package names.Toehold
V
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.

Volume answered 2/3, 2011 at 5:52 Comment(0)
L
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.

Lustrum answered 28/2, 2011 at 21:39 Comment(3)
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.Nathanaelnathanial
lib or libs? Its very important that it be libs.Lustrum
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;Nathanaelnathanial

© 2022 - 2024 — McMap. All rights reserved.