java - FFmpeg 链接器错误 : Error due to text relocations in libavcodec shared object

标签 java android android-ndk ffmpeg linker-errors

我正在尝试构建一个使用 FFmpeg native 代码进行视频解码和编码的 Android 应用程序。我有一台运行 32 位 Ubuntu 14.04、ADT 版本 23 的 64 位机器。我下载了 FFmpeg-2.4.4(32 位)并按照此处提到的步骤为 Android 构建它 - http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/

我使用的是最新的 Android NDK,即 NDK r10c。为了进行测试,我使用了此链接中给出的 FFmpeg 的 API 示例代码 - http://ffmpeg.org/doxygen/trunk/decoding__encoding_8c-source.html

我能够成功构建所有共享对象,并且 Android 项目成功编译,没有任何错误。

以下代码是加载所有共享对象的Android代码

public class CallNative {
public static String libName = "decode_encode" ;
public CallNative(){
    System.loadLibrary("avutil-54");
    System.loadLibrary("swresample-1");
    System.loadLibrary("avcodec-56");
    System.loadLibrary("avformat-56");
    System.loadLibrary("swscale-3");
    System.loadLibrary("avfilter-5");
    System.loadLibrary(libName);
}

public native int decode(String Filename, int length);

这就是从 Android 调用解码函数的方式。

Uri videoURI = Uri.parse(fileUri.toString());
                   String videoFilePath = getFilePathFromURI(getApplicationContext(), videoURI);
                   Log.d("SPLASH","Entering native decode call");
                   CallNative n = new CallNative();
                   n.decode(videoFilePath, videoFilePath.length());
                   Log.d("SPLASH","successfully returned from decode call");

当我调试时,应用程序在进入原生函数调用时崩溃。我收到以下链接器错误。

W/linker(32244): libavcodec-56.so has text relocations. This is wasting memory and prevents security hardening. Please fix.

我也对 FFmpeg 2.4.3 和 2.0.6 包进行了同样的尝试。我遇到了同样的错误。

如何解决?

最佳答案

该代码适用于所有 Android 版本 < 23。 IE。如果您将 targetSkdVersion 设置为 21,代码将在运行时出现警告。

不幸的是,自 Marshmallow (v23) 起,Google 不再允许加载带有文本重定位的库。因此,如果您将目标 SDK 版本设置为 23,您的应用将会崩溃。

Google 不会更改此行为,请参阅:https://code.google.com/p/android/issues/detail?id=191235&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

Ffmpeg 团队不会“很快”删除文本重定位,请参阅:https://trac.ffmpeg.org/ticket/4928

因此目前看来您唯一的选择是将目标 sdk 设置为 21。

关于java - FFmpeg 链接器错误 : Error due to text relocations in libavcodec shared object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270844/

相关文章:

android - 在后台运行 native 代码

java - 如何仅在 bean 存在时注入(inject)它

java - 无法在 java 动态 Web 项目(Eclipse、Tomcat)中更新 Mysql 数据库

android - 使用 CursorLoader 时应该在哪里处理查询结果?

android - 在 Nougat 上使用 Scoped Directory Access 捕获图像

android - 将 ios CGContextDrawImage 移植到 android

android - 在哪里放置 .so 文件,以便它包含在最终构建中

java - 我正在使用安卓相机,如果我点击相机按钮它会打开,但是拍完照片后,我的应用程序停止了?

java - Java 和 PHP 中相同的哈希算法给出不同的结果

android - 没有找到 JNI_OnLoad ... 跳过 init