KeePassJava2 icon indicating copy to clipboard operation
KeePassJava2 copied to clipboard

java.lang.NoSuchMethodError saving SimpleDatabase on Android

Open lubbo opened this issue 5 years ago • 10 comments

When I save the SimpleDatabase

        val basePath = ContextWrapper(context).filesDir
        val credentials = KdbxCreds(credentials.toByteArray())
        val db = secureDatabase ?: return
        FileOutputStream("$basePath${File.separator}$database.kdbx").use { outputStream ->
            db.save(credentials, outputStream)
        }

I get this error:

java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
        at org.linguafranca.pwdb.kdbx.Helpers.encodeBase64Content(Helpers.java:119)
        at org.linguafranca.pwdb.kdbx.simple.converter.Base64ByteArrayConverter.write(Base64ByteArrayConverter.java:38)
        at org.linguafranca.pwdb.kdbx.simple.converter.Base64ByteArrayConverter.write(Base64ByteArrayConverter.java:28)
        at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:180)
        at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:156)
        at org.simpleframework.xml.core.Source.setOverride(Source.java:384)
        at org.simpleframework.xml.core.Factory.setOverride(Factory.java:170)
        at org.simpleframework.xml.core.Composite.isOverridden(Composite.java:1312)
        at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1234)
        at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1127)
        at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1098)
        at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1004)
        at org.simpleframework.xml.core.Composite.write(Composite.java:975)
        at org.simpleframework.xml.core.Composite.write(Composite.java:952)
        at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1256)
        at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1239)
        at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1127)
        at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1098)
        at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1004)
        at org.simpleframework.xml.core.Composite.write(Composite.java:975)
        at org.simpleframework.xml.core.Composite.write(Composite.java:952)
        at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
        at org.simpleframework.xml.core.Traverser.write(Traverser.java:208)
        at org.simpleframework.xml.core.Traverser.write(Traverser.java:186)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1180)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1162)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1140)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1259)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1241)
        at org.simpleframework.xml.core.Persister.write(Persister.java:1222)
        at org.linguafranca.pwdb.kdbx.simple.SimpleDatabase.save(SimpleDatabase.java:236)
...

any suggestion?

lubbo avatar Mar 23 '20 18:03 lubbo

Is this project still alive?

lubbo avatar Mar 25 '20 07:03 lubbo

sure, why do you ask?

jorabin avatar Mar 25 '20 09:03 jorabin

You are picking up Base64 from /system/framework/org.apache.http.legacy.boot.jar rather than commons-codec.1.11.jar - you'll need to find a way to exclude the first from your classpath

jorabin avatar Mar 25 '20 09:03 jorabin

Please include in your build.gradle following reference to base64 support:

implementation group: 'commons-codec', name: 'commons-codec', version:'1.10'

ivanovpv avatar Mar 25 '20 10:03 ivanovpv

Thanks Pavel - NB it's 1.11

jorabin avatar Mar 25 '20 10:03 jorabin

Workable example for Android is here

Though it's a bit outdated, but still usable

ivanovpv avatar Mar 25 '20 10:03 ivanovpv

sure, why do you ask?

I haven't see commits since 2018 ... sorry.

lubbo avatar Mar 25 '20 11:03 lubbo

Please include in your build.gradle following reference to base64 support:

implementation group: 'commons-codec', name: 'commons-codec', version:'1.10'

I tried but the error persists ... trying resetting AndroidStudio cache... Nope. It doesn't work.

lubbo avatar Mar 25 '20 11:03 lubbo

Workable example for Android is here

Though it's a bit outdated, but still usable

I'm not able to open it in AndroidStudio ... Have you used Eclipse?

lubbo avatar Mar 25 '20 11:03 lubbo

Coming back to review, this still looks as though there are multiple JARs on the classpath and that an out of date version is being picked up - see earlier comment - I will close unless there is more discussion needed.

jorabin avatar May 08 '23 10:05 jorabin