objectbox / objectbox/objectbox-java
UnsatisfiedLinkError: no objectbox-jni-windows-x64 when installed to Program Files
Nessuno ha ancora preso questa issue.
- Lingua principale
- Java
- Stelle
- 4.6k
- Fork
- 311
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
Is there an existing issue?
- I have searched existing issues
Build info
- ObjectBox version: 5.0.0
- OS: Windows 10
- Device/ABI/architecture: x64
Steps to reproduce
I am building a KMP project with ObjectBox. When I run the jvmApp module directly (e.g., from the IDE), the ObjectBox .dll file is found and loaded correctly.
However, when I build a distributable package for deployment (e.g., using jpackage), the .dll file seems to be missing from the final package, causing it to fail at runtime.
What could be the problem?
(I apologize for asking this again. I posted this on StackOverflow, but since I haven't received a response yet, I'm posting it here as well.)
Expected behavior
Create objectbox-jni-windows-x64, when the installer installs the executable.
Actual behavior
The .dll file is not included when the installer installs the executable.
Code
Code
settings.gradle.kts(root)
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()
}
resolutionStrategy {
eachPlugin {
if (requested.id.id == "io.objectbox") {
useModule("io.objectbox:objectbox-gradle-plugin:${requested.version}")
}
if (requested.id.id == "com.google.dagger") {
useModule("com.google.dagger:dagger:${requested.version}")
}
if (requested.id.id == "com.google.dagger:hilt-android") {
useModule("com.google.dagger:hilt-android:${requested.version}")
}
}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "FireAlarmKMP"
include(":androidApp")
include(":jvmApp")
include(":shared:data-common")
include(":shared:data-jvm")
include(":shared:domain")
include(":shared:presentation-common")
include(":shared:data-android")
include(":shared:core-common")
include(":shared:core-android")
include(":shared:core-jvm")
include(":shared:presentation-android")
include(":shared:presentation-jvm")
build.gradle.kts(:jvmApp)
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
alias(libs.plugins.jetbrains.kotlin.jvm)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.kapt)
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
}
}
dependencies {
implementation(compose.desktop.currentOs)
implementation(libs.kotlinx.coroutines.swing)
implementation(libs.dagger)
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.androidx.lifecycle.runtime.compose)
configurations["kapt"].dependencies.add(project.dependencies.create(libs.dagger.compiler.get()))
implementation(project(":shared:presentation-common"))
implementation(project(":shared:presentation-jvm"))
implementation(project(":shared:domain"))
implementation(project(":shared:data-common"))
implementation(project(":shared:data-jvm"))
implementation(project(":shared:core-common"))
implementation(project(":shared:core-jvm"))
}
compose.desktop {
application {
mainClass = "com.blabla.jvmapp.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Exe)
packageName = "jvmapp"
packageVersion = "1.0.28"
}
}
}
build.gradle.kts(:data-jvm)
plugins {
alias(libs.plugins.jetbrains.kotlin.jvm)
alias(libs.plugins.kapt)
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
}
}
dependencies {
implementation(libs.arrow.core)
implementation(libs.arrow.fx.coroutines)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.objectbox.windows)
implementation(libs.objectbox.kotlin)
kapt(libs.objectbox.processor)
implementation(libs.dagger)
kapt(libs.dagger.compiler)
implementation(project(":shared:data-common"))
implementation(project(":shared:core-common"))
implementation(project(":shared:domain"))
}
apply(plugin = "java-library")
apply(plugin = "io.objectbox")
Logs, stack traces
Logs
Caused by: java.lang.UnsatisfiedLinkError: no objectbox-jni-windows-x64 in java.library.path: C:\Program Files\com.blabla.jvmapp\app/resources
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)
at java.base/java.lang.System.loadLibrary(Unknown Source)
at io.objectbox.internal.NativeLibraryLoader.<clinit>(NativeLibraryLoader.java:98)
... 48 more
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia da build.gradle.kts in :jvmApp e :data-jvm, quindi analizza la configurazione nativeDistributions di Compose Desktop e la directory delle risorse dell’applicazione installata. Riproduci la build del pacchetto Windows e confrontala con l’applicazione JVM eseguita direttamente, usando UnsatisfiedLinkError e la posizione di NativeLibraryLoader come primi indizi. Il lavoro è completo quando l’installer del pacchetto include objectbox-jni-windows-x64 e l’applicazione installata si avvia senza l’errore della libreria nativa.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java, kotlin
- Ambito
- build-system, databases, desktop-dev
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 48/100