我正在使用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
答案 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 ...