Android Studio链接预建库.so错误

时间:2016-06-14 08:38:22

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

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

的src

- 主

---- jniLibs

------ armeabi

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

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

-------- xx.so

在成绩剧本中,ndk的abifilter是armeabi。

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

错误:(14)对#av; av_register_all'

的未定义引用

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

  

com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:进程'命令' / Users / zhouyf / Library / Android / sdk / ndk-bundle / NDK建造''完成非零退出值2

链接器中似乎存在问题。但我发现答案只是将.so文件放到jniLibs / armeabi就行了。 我是否需要修改build.gradle文件以链接那些.so文件?

P.S。

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

环境: Android Studio 2.1.1 Mac OS X 10.11.5

1 个答案:

答案 0 :(得分:0)

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

ndk-build

中停用默认build.gradle
sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
    jni.srcDirs = []
}

ndk-build

中添加您自己的build.gradle任务
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 ...