objectbox / objectbox/objectbox-java
UnsatisfiedLinkError: no objectbox-jni-windows-x64 when installed to Program Files
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Java
- Star
- 4.6k
- Fork
- 311
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với build.gradle.kts trong :jvmApp và :data-jvm, sau đó kiểm tra cấu hình nativeDistributions của Compose Desktop và thư mục resources của ứng dụng đã cài đặt. Tái hiện quá trình build gói Windows và so sánh với ứng dụng JVM chạy trực tiếp, sử dụng UnsatisfiedLinkError và vị trí của NativeLibraryLoader làm những manh mối đầu tiên. Hoàn tất khi trình cài đặt đã đóng gói bao gồm objectbox-jni-windows-x64 và ứng dụng đã cài đặt khởi động mà không gặp lỗi thư viện native.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java, kotlin
- Lĩnh vực
- build-system, databases, desktop-dev
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100