objectbox / objectbox/objectbox-java

UnsatisfiedLinkError: no objectbox-jni-windows-x64 when installed to Program Files

Đang mở
#1,225 9 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

documentation enhancement
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?
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

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.