gpt4 book ai didi

Android Studio 链接预建库.so 错误

转载 作者:行者123 更新时间:2023-12-03 06:07:15 26 4
gpt4 key购买 nike

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

源代码

- 主要的

----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_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'' finished with non-zero exit value 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

最佳答案

您应该在使用 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 ...

关于Android Studio 链接预建库.so 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com