Android NDK链接共享库不满意链接器错误

时间:2014-01-06 14:53:39

标签: android android-ndk ffmpeg

我有一个问题,

以下是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文件夹中看到了这两个库 当我运行应用程序时,出现不满意的链接器错误

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,为什么预建库的模块名称没有改变,但可能是什么问题?

2 个答案:

答案 0 :(得分:2)

让我们从第二个问题开始。不,预建库的LOCAL_MODULE名称不会更改文件名。这就是它的设计方式。是的,此名称对构建的静态和共享库具有更显着的影响。但重建后的模式并不遵循相同的模式。

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

在您的情况下,此讨论将解析为

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

答案 1 :(得分:0)

如果ndk构建正在创建.so文件,但在运行时抛出不满意的Linker错误。请检查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