objectbox / objectbox/objectbox-java
UnsatisfiedLinkError: no objectbox-jni-windows-x64 when installed to Program Files
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Java
- Estrellas
- 4.6k
- Forks
- 311
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con build.gradle.kts en :jvmApp y :data-jvm, y después inspecciona la configuración nativeDistributions de Compose Desktop y el directorio de recursos de la aplicación instalada. Reproduce la compilación del paquete de Windows y compárala con la aplicación JVM ejecutada directamente, usando UnsatisfiedLinkError y la ubicación de NativeLibraryLoader como primeras pistas. Se considera terminado cuando el instalador empaquetado incluye objectbox-jni-windows-x64 y la aplicación instalada se inicia sin el error de la biblioteca nativa.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- java, kotlin
- Área
- build-system, databases, desktop-dev
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 48/100