繁体   English   中英

Android Studio链接预建库.so错误

[英]Android Studio link prebuilt library .so error

我正在使用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_register_all”的未定义引用

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

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

看来链接器中存在问题。 但是我找到了答案,只需将.so文件放入jniLibs / armeabi中就可以了。 我需要修改build.gradle文件来链接那些.so文件吗?

聚苯乙烯

如果我不调用API,则该应用程序将成功运行,仅显示以下警告:W /链接器:libavformat-57.so:未使用的DT条目:类型0x6ffffffe arg 0x60e0 W /链接器:libavformat-57.so:未使用的DT条目:类型0x6fffffff arg 0x2

环境:Android Studio 2.1.1 Mac OS X 10.11.5

使用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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM