【问题标题】:Object Box error on app start - No implementation found for void io.objectbox.BoxStore.nativeDelete(long)应用程序启动时出现对象框错误 - 找不到 void io.objectbox.BoxStore.nativeDelete(long) 的实现
【发布时间】:2017-11-10 23:16:53
【问题描述】:

正如标题所说的那样。

当我启动我的 Android 应用程序时,我收到以下错误

No implementation found for void io.objectbox.BoxStore.nativeDelete(long)

稍后我会添加完整的 build.gradle 和应用程序代码,因为我很着急,但我想我应该发布一下,以防万一有已知且明显的解决方案。

1.1.0 和 1.2.0 我都试过了

更新:

一些进一步的信息。我正在尝试在我的 LibGDX 项目中使用 ObjectBox。 LibGDX 是一个跨平台的游戏库,你可以用 Java 编写代码,它会输出 Android、iOS 和桌面版本。

我决定尝试使用 Java 版本,而不是使用 Android 实现的 ObjectBox,这样理论上它可以在所有三个平台上使用。我不确定,但也许这就是问题所在。使用 Java 版本,但在 Android 平台上。

更新 2:(堆栈跟踪)

11-10 09:48:05.159 16269-16278/com.myapp E/System: java.lang.UnsatisfiedLinkError: No implementation found for void io.objectbox.BoxStore.nativeDelete(long) (tried Java_io_objectbox_BoxStore_nativeDelete and Java_io_objectbox_BoxStore_nativeDelete__J)
                                                                              at io.objectbox.BoxStore.nativeDelete(Native Method)
                                                                              at io.objectbox.BoxStore.close(BoxStore.java:355)
                                                                              at io.objectbox.BoxStore.finalize(BoxStore.java:245)
                                                                              at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:222)
                                                                              at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:209)
                                                                              at java.lang.Thread.run(Thread.java:762)
11-10 09:48:05.261 16269-16269/com.myapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.myapp, PID: 16269
                                                                                  java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-1/lib/arm64, /data/app/com.myapp-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libobjectbox.so"
                                                                                      at java.lang.Runtime.loadLibrary0(Runtime.java:972)
                                                                                      at java.lang.System.loadLibrary(System.java:1567)
                                                                                      at io.objectbox.internal.NativeLibraryLoader.<clinit>(NativeLibraryLoader.java:44)
                                                                                      at io.objectbox.internal.NativeLibraryLoader.ensureLoaded(NativeLibraryLoader.java:82)
                                                                                      at io.objectbox.BoxStore.<init>(BoxStore.java:170)
                                                                                      at io.objectbox.BoxStoreBuilder.build(BoxStoreBuilder.java:243)
                                                                                      at com.myapp.db.DB.createMyObjectBox(DB.java:28)
                                                                                      at com.myapp.db.DB.updateAchievements(DB.java:35)
                                                                                      at com.myapp.screens.MainMenuScreen.achievementsFinishedLoading(MainMenuScreen.java:1241)
                                                                                      at com.myapp.android.AndroidPlayServices$GetAchievementsAsyncTask.onPostExecute(AndroidPlayServices.java:418)
                                                                                      at com.myapp.android.AndroidPlayServices$GetAchievementsAsyncTask.onPostExecute(AndroidPlayServices.java:364)
                                                                                      at android.os.AsyncTask.finish(AsyncTask.java:660)
                                                                                      at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                                      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
1

build.gradle(其中很多可能会被忽略,但它是我使用 ObjectBox 的“核心”项目,而不是 Android 项目。另外,我知道我的机器是 Linux 64 位,所以我决定注释掉所有检测的东西和windows的东西,只使用linux扩展/lib)

buildscript {
    ext.objectboxVersion = '1.1.0'
//    ext {
//        osName = System.getProperty("os.name").toLowerCase()
//        isLinux = osName.contains("linux")
//        isWindows = osName.contains("windows")
//        is64 = System.getProperty("sun.arch.data.model") == "64"
//        isLinux64 = isLinux && is64
//        isWindows64 = isWindows && is64
//    }
    repositories {
        mavenCentral()
        jcenter()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url 'https://maven.fabric.io/public' }
        maven { url "https://maven.java.net/content/groups/public/" }
        maven { url "http://objectbox.net/beta-repo/" }
        maven { url "https://plugins.gradle.org/m2/" }
        google()
    }
//        https://maven.fabric.io/public/io/fabric/tools/gradle/maven-metadata.xml look here for up to date fabric version

    dependencies {
        classpath 'com.github.triplet.gradle:play-publisher:1.1.5'
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'io.fabric.tools:gradle:1.24.4'
        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.12"
    }
}

allprojects {
    apply plugin: "eclipse"
    apply plugin: "idea"

    version = '1.0'
    ext {
        appName = "Masters Gallery by Reiner Knizia"
        gdxVersion = '1.9.6'
        roboVMVersion = '1.12.0'
        box2DLightsVersion = '1.4'
        ashleyVersion = '1.6.0'
        aiVersion = '1.6.0'
    }

    repositories {
        mavenCentral()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
        maven { url "http://objectbox.net/beta-repo/" }
        google()
    }
}

project(":desktop") {
    apply plugin: "java"

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
        compile "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
    }
}

project(":android") {
    apply plugin: "android"
    apply plugin: 'com.android.application'
    apply plugin: 'io.fabric'
    apply plugin: 'com.github.triplet.play'
//    apply plugin: 'io.objectbox' // after applying Android plugin

    repositories {
        jcenter()
//        maven { url 'https://maven.fabric.io/public' }
        flatDir { dirs 'libs' }
    }
    // .aar repositories
    repositories {
        flatDir { dirs 'libs' }
    }

    configurations { natives }

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        compile "com.badlogicgames.gdx:gdx-ai:$aiVersion"
        compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
        compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
            transitive = true
        }
        compile 'com.android.support:support-annotations:27.0.0'
        compile 'com.google.android.gms:play-services-auth:11.6.0'
        compile 'com.google.android.gms:play-services-games:11.6.0'
        compile 'com.android.support:multidex:1.0.2'
        compile 'com.sun.mail:android-mail:1.6.0'
        compile 'com.sun.mail:android-activation:1.6.0'
    }
}

project(":core") {
    apply plugin: "java"
    apply plugin: 'net.ltgt.apt-idea'
    apply plugin: 'io.objectbox'

    dependencies {
        compile "com.badlogicgames.gdx:gdx:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-ai:$aiVersion"
        compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-ai:$aiVersion"
        compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
        compile "io.objectbox:objectbox-java:$objectboxVersion"

        // everything compiles without this, but it might still be needed
//        if (isLinux64) {
//            compile "io.objectbox:objectbox-linux:$objectboxVersion"
//        } else if (isWindows64) {
//            compile "io.objectbox:objectbox-windows:$objectboxVersion"
//        } else println("Native dependency could not be set up for unsupported OS: " + osName)

        compile fileTree(dir: 'libs', include: '*.jar')
        compile fileTree(dir: 'libs', include: '*.aar')
    }
}

使用 ObjectBox 的 DB 类

private void createMyObjectBox() throws IOException {
    File tempFile = File.createTempFile("objectstorefile", "");
    tempFile.delete();
    boxStoreDir = tempFile;
    Gdx.app.error("DB","tempfile="+tempFile);
    Gdx.app.error("DB","boxstoredir="+boxStoreDir);
    store = MyObjectBox.builder().directory(boxStoreDir).build();
}

【问题讨论】:

  • 请发布完整的调用堆栈 - 我想知道是什么导致了对 nativeDelete 的调用。
  • 嗨@Markus,我会在午餐时间添加这个。感谢您这么快回复
  • @MarkusJunginger 希望这足以至少看看。 (对不起,堆栈跟踪的格式问题)

标签: android objectbox


【解决方案1】:

如果我没记错的话,您只是在 Java 项目中定义了 ObjectBox 依赖项。似乎缺少的是 Android 特定的工件:

compile "io.objectbox:objectbox-android:$objectboxVersion"

这包括共享库(本机 .so 文件)。

其他说明:

  • 确保您在所有库中都获得一致的 ABI 支持。看起来您的 LibGDX 带有 armeabi,它非常旧,因此不包含在 ObjectBox 中。 ObjectBox Android 带有 armeabi-v7a、arm64-v8a 和 x86 支持。我建议从您的 LibGDX 设置中删除所有其他人。否则应用可能会在某些设备上崩溃,因为它不能混合使用 32 位和 64 位库。
  • 您可以通过将 compile "io.objectbox:objectbox-linux:$objectboxVersion" 添加到您的 Linux 计算机的桌面项目来尝试使用 ObjectBox for desktop
  • 您使用的 ObjectBox 版本已过时。请查看changelog 获取最新版本。

【讨论】:

  • 感谢回复,今晚我试试。正如我在一次更新中所说,我的库是一个跨平台的库,它是用 Java 编写的,然后可以创建 Android、iOS 和桌面版本。我希望在 Java“核心”项目中使用一个数据库,因此我没有在 gradle 中包含 Android 版本。但是,如果看起来我无法使用它,我必须在 Android 上使用 Android 版本,然后可能会在未来的 iOS 版本发布时使用它,那就这样吧。仅此而已
  • 另外,我知道这是一个旧版本。我尝试了 1.2.0 和 1.1.0,但是当我复制粘贴时,我没有将它改回 1.2.0 :D 至于 abi 的东西,很高兴知道。我知道 armeabi 已经很旧了,并且在那里为极少数的旧手机提供了它。但如果 ObjectBox 不能使用它,我还不如删除它。
  • 至于桌面建议,这就是我在我的java“核心”项目中尝试的,它是纯Java而不是Android。桌面项目是一个实际的桌面应用,不是我发布的,所以放在那里用不着。
  • 通常在桌面上开发会更快——libGDX 和 ObjectBox 支持这一点。
  • 我做到了,它似乎可以工作:D 我没有使用应用插件:'io.objectbox' 虽然
猜你喜欢
  • 2020-01-03
  • 1970-01-01
  • 2018-03-26
  • 2017-05-07
  • 2020-05-12
  • 1970-01-01
  • 2012-05-29
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多