【问题标题】:Android NDK Linking shared library unsatisfied Linker ErrorAndroid NDK Linking shared library unsatisfied Linker Error
【发布时间】:2014-01-06 14:53:38
【问题描述】:

我有问题,

下面是Android.mk

LOCAL_PATH := $(call my-dir)
INITIAL_PATH := $(LOCAL_PATH)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpegbuilt
LOCAL_SRC_FILES := libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/
include $(PREBUILT_SHARED_LIBRARY)


LOCAL_PATH := $(INITIAL_PATH)
LOCAL_MODULE    := main_module
LOCAL_ARM_MODE := arm  # remove this if you want thumb mode
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := ffmpegbuilt
include $(BUILD_SHARED_LIBRARY)

它按预期创建了两个 shared_libraries。我在libs/armeabi 文件夹中看到了这两个库 当我运行应用程序时,出现 Unsatisfied Linker 错误

01-06 20:21:38.281: E/AndroidRuntime(435): FATAL EXCEPTION: main
01-06 20:21:38.281: E/AndroidRuntime(435): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]:    32 could not load needed library 'libffmpeg.so' for 'libmain_module.so' (load_library[1104]: Library 'libffmpeg.so' not found)
01-06 20:21:38.281: E/AndroidRuntime(435):  at java.lang.Runtime.loadLibrary(Runtime.java:434)
01-06 20:21:38.281: E/AndroidRuntime(435):  at java.lang.System.loadLibrary(System.java:554)

可能是什么问题,虽然我定义了LOCAL_MODULE := ffmpegbuilt,为什么预建库的模块名称没有改变?

【问题讨论】:

    标签: android android-ndk ffmpeg


    【解决方案1】:

    让我们从第二个问题开始。不,预建库的 LOCAL_MODULE 名称不会更改文件的名称。这就是它的设计方式。是的,这个名称对 built 静态库和共享库的影响要大得多。但是重建的不遵循相同的模式。

    现在回答您的第一个问题。 Android 不会在本地应用的 lib 目录中查找动态依赖项。有一些技术原因,甚至有一些解决方法。但通常情况下,我们只是简单地loadLibrary Java 中的本地共享库,保持正确的顺序,以便在每一步都解决外部依赖关系。

    在你的情况下,这个讨论解决成

    System.loadLibrary("ffmpeg");
    System.loadLibrary("main_module");
    

    【讨论】:

    • 谢谢 Alex,第二个问题!
    • 我尝试了你的建议,但还是一样!
    • 谢谢alex,它成功了,实际上加载库的顺序很重要!我尝试先加载 main_module 然后加载 ffmpeg,但正如您所说,应该首先添加依赖关系!我明白了
    【解决方案2】:

    如果 ndk 构建正在创建 .so 文件,但在运行时会引发不满意的链接器错误。请检查 build.gradle 文件。

    Build.gradle 应包含以下行以遵循构建步骤并引用共享库。

    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }
    

    也可以通过提供 Android.mk 文件的路径从 UI 添加此信息。 本机代码可以使用 cMake 文件或 Android.mk 文件进行编译。

    点击链接 - https://developer.android.com/studio/projects/gradle-external-native-builds

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2023-01-13
      • 2018-01-08
      • 1970-01-01
      • 2021-01-29
      • 2017-10-24
      相关资源
      最近更新 更多