为什么我会收到 java.lang.UnsatisfiedLinkError: dlopen failed: 在我的 Android 项目中找不到库“libc++_shared.so”?

问题描述 投票:0回答:1

你好,我得到了这个 Android 应用程序项目,在这部分代码中:

        init {
        try {
            System.loadLibrary("c++_shared")
        } catch (e: Exception) {
            Log.e(TAG, "Could not load library due to: ${Log.getStackTraceString(e)}")
            //throw e
        }
    }

我得到:

    java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
    at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
    at java.lang.Runtime.loadLibrary0(Runtime.java:998)
    at java.lang.System.loadLibrary(System.java:1661)
    at com.assembleinc.kidstunes.media.MediaPlaybackService.<clinit>(MediaPlaybackService.kt:237)
    at com.assembleinc.kidstunes.media.MediaBrowserController.onStart(MediaBrowserController.kt:56)
    at com.assembleinc.kidstunes.ui.main.MainActivity.onStart(MainActivity.kt:72)

我得到了 CMake 版本 3.18.1-g262b901 在我的 gradle 中我得到了:

    compileSdkVersion 33
defaultConfig {
    applicationId "com.test.music"
    minSdkVersion 23
    targetSdkVersion 33
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

    externalNativeBuild {
        cmake {
            cppFlags ""
            arguments "-DANDROID_STL=c++_shared"
        }
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
ndkVersion '21.3.6528147'

无论我在Android Studio中点击多少次:

  1. 刷新了 C++ 链接项目
  2. 干净
  3. 构建 一切看起来都很好,但运行时我收到前面提到的错误。

有人知道为什么会发生这种情况吗?

提前感谢大家的帮助。

android android-studio cmake android-ndk
1个回答
0
投票

@Michael 在原始问题下方的评论回答了所提出的问题,但我只是想确保那些偶然发现这个问题的人可以轻松找到答案。

externalNativeBuild {
    cmake {
        cppFlags ""
        arguments "-DANDROID_STL=c++_shared"
    }
}

问题出在build.gradle文件中的以下代码行

参数“-DANDROID_STL=c++_shared”

这不是必需的,因为无论如何,本机代码所需的任何库都将包含在本机工具链构建的共享库中。

您可能遇到的另一个问题是本机代码所需的其他库以及用于构建它们的推荐 NDK 版本。例如,就我而言,tensorflow 团队推荐 NDK 21b,如果您遇到同样的问题,您也许可以通过降级到早期版本的 NDK 来解决问题。由于 NDK 版本不匹配(之前我尝试使用 NDK 26b),我遇到了这个问题,并且得到了 OP 询问的错误,当我返回 NDK 21b 时,错误消失了。

© www.soinside.com 2019 - 2024. All rights reserved.