【问题标题】:"JNI FatalError called: Unable to load library"“调用 JNI FatalError:无法加载库”
【发布时间】:2020-01-19 03:01:16
【问题描述】:

我有一个配置为动态功能模块的统一项目。这可以按需安装。但是当我运行它时,应用程序崩溃并出现以下错误:

调用了 JNI FatalError:无法加载库:/data/app/com.example.app-8fx1RRZrQ34BcwXf8ajjqZ==/lib/arm64/libunity.so [dlopen 失败:未找到库“libunity.so”]

Unity项目的目标activity包括SplitCompat.install(this);

它的 gradle 看起来像:

    // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

    buildscript {
        repositories {
            mavenCentral()
            google()
            jcenter()
        }

        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.0'
        }
    }

    allprojects {
        repositories {
            mavenCentral()
            google()
            jcenter()
            flatDir {
                dirs 'libs'
            }
        }
    }

    apply plugin: 'com.android.dynamic-feature'

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    }

    android {
        compileSdkVersion rootProject.compileSdk
        buildToolsVersion rootProject.buildTools

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        defaultConfig {
            minSdkVersion rootProject.minSdk
            targetSdkVersion rootProject.targetSdk
            versionCode rootProject.versionCode
            versionName rootProject.versionName

            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }

        lintOptions {
            abortOnError false
        }

        aaptOptions {
            noCompress = ['.unity3d', '.ress', '.resource', '.obb']
        }

        flavorDimensions "default"

        productFlavors {
            staging {
                dimension "default"
            }

            production {
                dimension "default"
            }

            develop {
                dimension "default"
            }
        }

        compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }

        buildTypes {
            debug {
                minifyEnabled false
                useProguard false
                jniDebuggable true
            }
            release {
                minifyEnabled false
                useProguard false
            }
        }

        packagingOptions {
            doNotStrip '*/armeabi-v7a/*.so'
            doNotStrip '*/arm64-v8a/*.so'
    //        doNotStrip '*/x86/*.so'
        }

    }

    dependencies {
        implementation project(':app')
    }

虽然app模块的gradle有:

    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = false
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }

我什至尝试通过在 gradle.properties 文件中设置 android.bundle.enableUncompressedNativeLibs = false 来禁用 .so 压缩,但确切的错误仍然存​​在。

在 aab 中看到的功能模块的内部。 .so 库存在:

我该如何解决这个问题?

更新 1 -

我上面描述的问题发生在第一次从 Play 商店安装 aab 时。请注意,我能够成功安装功能模块,并且仅当我尝试运行它时才会出现错误。但是,当我在同一安装中推送增量更新时,功能模块能够以某种方式完美运行,并且能够找到必要的 .so 文件。我已经多次尝试这些步骤以验证观察结果。

【问题讨论】:

  • 你有库 libunity.so not found 记住 apk 只是一个 zip 文件,所以 解压缩 它并检查 ibunity.so 是否在 /lib/arm64/
  • IC 我建议你阅读aab 并尝试bundletool
  • 您描述的问题的常见原因是:proguard,手动库丢失/在错误的位置(路径),需要 gradle-lib- 复制(路径)...解决您的问题,付出一些努力在,什么去哪里,文件布局(目录树)查看我的答案here,向您展示一种方法
  • 可能是一个简单的修复但没有足够的信息,请在 “而且它的 gradle 看起来像:” 哪个? 1 个文件 2 个文件 ?它们在哪里(相对路径)。 “虽然 app 模块的 gradle 有:”.请明确点。可能的修复:proguard、lib 路径...
  • 嗨@JonGoodwin,我知道apks 和aabs 本质上是压缩包。我更新了我的查询并附上了动态功能内部的屏幕截图。我还使用 bundletool 提取了 apk,我可以看到生成了 .so 库。我上面分享的gradle文件内容分别属于unityProj.gradle和app.gradle(不是根级别的,这里用处不大)。

标签: android android-studio unity3d google-play android-app-bundle


【解决方案1】:

确保在您的动态功能模块中使用 SplitCompat 加载统一库:https://developer.android.com/guide/app-bundle/playcore#load_native_libs

我不确定这是否由 Unity 自动处理,但如果是,您可能希望与他们联系以解决此问题。

【讨论】:

  • 我之前尝试过但没有成功,但现在重新尝试有助于继续前进。原来 loadLibrary("") 严格采用库“名称”,应该排除“lib”和“.so”。但是现在我在加载 UnityActivity 时看到另一个错误 - 无法提取 Il2CPP 所需的资源。 这在多个测试设备中持续存在。 UnityActivity 有 SplitCompat.install(this)。
  • 这看起来独立于 DFM。不使用 DFM 时是否有效?
  • 我也怀疑。当集成为项目中的简单模块时,它可以正常工作。只有当 DFM 出现时才会出现问题。
  • DFM 中是否有任何活动?
  • 是的,统一模块(即 DFM)有一个我从基本模块启动的活动。所以流程是 - 我安装 DFM(Unity 模块),加载统一库,然后启动 UnityActivity。
【解决方案2】:

我还在日志文件中看到“JNI 致命错误:无法加载库 .../libunity.so”。

在我的例子中,我注意到 Unity 记录了一个关于无法读取 bin/Data/settings.xml 文件的错误。我将这些目录和文件添加到我的项目资产中,然后 libunity 库能够加载。因此,即使您可能会看到一条消息说找不到 libunity.so 文件,但问题实际上是统一库无法正确初始化。

【讨论】:

  • 在升级我使用的 gradle 版本后遇到了这个问题。切换回较旧的gradle,问题就消失了。我没有时间研究为什么会这样。
  • 我得出了一个“假设”的结论,即 Unity 不支持 abi 拆分。我们(我以前工作的公司)放弃了使用 Unity 的想法,转而使用原生实现。自从我上次在他们的论坛上发布此问题以来,还没有收到 Unity 支持的任何消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多