【问题标题】:Android Studio link prebuilt library .so errorAndroid Studio 链接预建库.so 错误
【发布时间】:2016-10-14 21:17:28
【问题描述】:

我正在使用 FFmpeg 开发一个 Android 应用程序。我已将 FFmpeg 构建到 *.so 文件中,并将它们放入 jniLibs 中,如下所示:

src

--主要

----jniLibs

-----armeabi

--------libavcodec-57.so

--------libavformat-57.so

--------xx.so

在grade script中,ndk的abifilter是armeabi。

在 java 文件中,我已经成功加载了这些 .so 文件,并且构建的 apk 也包含它们。但是,当我在 src/jni 文件夹下的 .c 文件中使用它们的任何 API(例如 av_register_all())时,会出现构建错误:

错误:(14) 未定义对 'av_register_all' 的引用

错误:任务 ':app:compileDebugNdk' 执行失败。

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Users/zhouyf/Library/Android/sdk/ndk-bundle/ndk-build'' 完成非零退出值 2

链接器中似乎存在问题。但我发现只需将 .so 文件放入 jniLibs/armeabi 就可以了。 我需要修改 build.gradle 文件来链接那些 .so 文件吗?

附言

如果我不调用 API,应用程序将成功运行,只有警告:W/linker: libavformat-57.so: used DT entry: type 0x6ffffffe arg 0x60e0 W/链接器:libavformat-57.so:未使用的 DT 条目:类型 0x6fffffff arg 0x2

环境: 安卓工作室 2.1.1 Mac OS X 10.11.5

【问题讨论】:

  • 尝试升级到AndroiStudio 2.2,您将与内置调试器externalNativeBuild的其他好东西相处融洽

标签: android gradle ffmpeg android-ndk java-native-interface


【解决方案1】:

您应该在使用ndk-build 构建时将库添加为依赖项。

在您的build.gradle 中禁用默认ndk-build

sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
    jni.srcDirs = []
}

build.gradle 中添加您自己的ndk-build 任务

def ndkDir = properties.getProperty("ndk.dir")

task ndkBuild(type: Exec) {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine ndkDir + File.separator + 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
    } else {
        commandLine ndkDir + File.separator + 'ndk-build', '-C', file('src/main/jni').absolutePath
    }
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

最后,在您的Android.mk 中,添加这样的库。

LOCAL_MODULE := # ...
# ...
LOCAL_LDFLAGS += -L/path/of/the/libraries -lavcodec-57 -lavformat-57 ...

【讨论】:

  • IDE为Android Studio,自动生成Android.mk。对 Android.mk 的任何修改都不起作用
  • 我检查了我的Android.mk,发现里面没有-lavcodec-57。但是如果我手动修改,gradle会撤消我的修改
  • 完成!谢谢你的提示!我禁用了默认的 ndk-build 并编写了一个 Android.mk 并手动执行了 ndk-build 命令。
  • 可惜Android Studio的默认功能无法处理这个问题
  • @ZhouYufeng 在实验构建插件中有这个功能。检查here
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2012-12-28
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多