Davin Reinaldo Gozali
Davin Reinaldo Gozali

Reputation: 301

SQLDelight - java.lang.UnsatisfiedLinkError: couldn't find "libsqlitejdbc.so"

Runtime Environment

SQLDelight version: 1.4.3
Application OS: Android

Bug Description

I'm trying to create SQLDelight in library level as kotlin multiplatform library and deploy it as android library...

Then when I added it as dependencies in my Android apps (separated project, because I want to treat it as client who used my library later), I got a Runtime issue with the following stacktrace :

2020-12-01 10:02:40.827 3642-3642/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.socketdummy, PID: 3642
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.socketdummy-iBZCoVo2j0qCEXnpJ23JAg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.socketdummy-iBZCoVo2j0qCEXnpJ23JAg==/lib/x86, /system/lib, /system/product/lib]]] couldn't find "libsqlitejdbc.so"
        at java.lang.Runtime.loadLibrary0(Runtime.java:1067)
        at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
        at java.lang.System.loadLibrary(System.java:1667)
        at org.sqlite.core.NativeDB.<clinit>(NativeDB.java:38)
        at org.sqlite.core.NativeDB.load(NativeDB.java:53)
        at org.sqlite.core.CoreConnection.open(CoreConnection.java:211)
        at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:76)
        at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:25)
        at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:24)
        at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:45)
        at org.sqlite.JDBC.createConnection(JDBC.java:114)
        at org.sqlite.JDBC.connect(JDBC.java:88)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:190)
        at com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver.<init>(JdbcSqliteDriver.kt:25)
        at com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver.<init>(JdbcSqliteDriver.kt:14)
        at bca.lib.data.local.driver.DatabaseDriverFactory.createDriver(DatabaseDriverFactory.kt:21)
        at bca.lib.data.local.driver.DatabaseDriverFactoryKt.getSQLDriver(DatabaseDriverFactory.kt:29)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$6.invoke(KodeinInjector.kt:22)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$6.invoke(Unknown Source:2)
        at org.kodein.di.bindings.Singleton$getFactory$1$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Reference$Local$Companion.invoke$kodein_di(references.kt:16)
        at org.kodein.di.bindings.Strong$Companion.make(references.kt:31)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:96)
        at org.kodein.di.bindings.StandardScopeRegistry.getOrCreate(scopes.kt:64)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:96)
        at org.kodein.di.internal.DIContainerImpl$factory$1.invoke(DIContainerImpl.kt:160)
        at org.kodein.di.DIContainer$provider$$inlined$toProvider$1.invoke(curry.kt:14)
        at org.kodein.di.internal.DirectDIBaseImpl.Instance(DirectDIImpl.kt:30)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$5.invoke(KodeinInjector.kt:25)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$5.invoke(Unknown Source:2)
        at org.kodein.di.bindings.Singleton$getFactory$1$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Reference$Local$Companion.invoke$kodein_di(references.kt:16)
        at org.kodein.di.bindings.Strong$Companion.make(references.kt:31)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:96)
        at org.kodein.di.bindings.StandardScopeRegistry.getOrCreate(scopes.kt:64)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:96)
        at org.kodein.di.internal.DIContainerImpl$factory$1.invoke(DIContainerImpl.kt:160)
        at org.kodein.di.DIContainer$provider$$inlined$toProvider$1.invoke(curry.kt:14)
        at org.kodein.di.internal.DirectDIBaseImpl.Instance(DirectDIImpl.kt:30)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$4.invoke(KodeinInjector.kt:25)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$4.invoke(Unknown Source:2)
        at org.kodein.di.bindings.Singleton$getFactory$1$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Reference$Local$Companion.invoke$kodein_di(references.kt:16)
2020-12-01 10:02:40.829 3642-3642/? E/AndroidRuntime:     at org.kodein.di.bindings.Strong$Companion.make(references.kt:31)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:96)
        at org.kodein.di.bindings.StandardScopeRegistry.getOrCreate(scopes.kt:64)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:127)
        at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:96)
        at org.kodein.di.internal.DIContainerImpl$factory$1.invoke(DIContainerImpl.kt:160)
        at org.kodein.di.DIContainer$provider$$inlined$toProvider$1.invoke(curry.kt:14)
        at org.kodein.di.internal.DirectDIBaseImpl.Instance(DirectDIImpl.kt:30)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$2.invoke(KodeinInjector.kt:25)
        at bca.lib.di.KodeinInjectorKt$kodeinInjector$1$2.invoke(Unknown Source:2)
        at org.kodein.di.bindings.Provider$getFactory$1.invoke(standardBindings.kt:86)
        at org.kodein.di.bindings.Provider$getFactory$1.invoke(standardBindings.kt:80)
        at org.kodein.di.internal.DIContainerImpl$factory$1.invoke(DIContainerImpl.kt:160)
        at org.kodein.di.DIContainer$provider$$inlined$toProvider$1.invoke(curry.kt:14)
        at org.kodein.di.internal.DirectDIBaseImpl.Instance(DirectDIImpl.kt:30)
        at bca.lib.ConnectionManager$connect$provisionUseCase$2.invoke(ConnectionManager.kt:28)
        at bca.lib.ConnectionManager$connect$provisionUseCase$2.invoke(ConnectionManager.kt:10)
        at org.kodein.di.DIAwareKt$newInstance$1.invoke(DIAware.kt:268)
        at org.kodein.di.DIAwareKt$newInstance$1.invoke(Unknown Source:4)
        at org.kodein.di.DIProperty$provideDelegate$1.invoke(properties.kt:46)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at bca.lib.ConnectionManager.connect(ConnectionManager.kt:16)
        at com.example.socketdummy.MainActivity.lambda$onCreate$0(MainActivity.java:31)
        at com.example.socketdummy.-$$Lambda$MainActivity$GO0OJj7ZT4UkfvPtudR0IznuTHw.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:7125)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

it said no "libsqlitejdbc.so" was found..., did I make a mistake? and how to solve this problem?

according to the documentation I understand, I just addded this following dependencies in my Android apps :

implementation 'com.squareup.sqldelight:android-driver:1.4.3'

I need solution for this issue with the following conditions:

  1. the SQLDelight definition is on Library layer (including .sq, driver actual definition) and can be deployed as android lib or iOS framework
  2. it can be implemented as dependencies in the client apps later (ex: Android / iOS)

Thank you

Upvotes: 0

Views: 1188

Answers (1)

Kevin Galligan
Kevin Galligan

Reputation: 17292

Somehow you have included the jdbc driver. See lines in the stack trace related to com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver. I would guess this either crept in because you intended them to run tests in the JVM that way, or you are also making this library available for server side and the config is not set up properly. Seeing the gradle config might help.

Upvotes: 3

Related Questions