FFmpeg链接器错误:由于libavcodec共享对象中的文本重定位导致错误

时间:2014-12-03 11:39:28

标签: java android android-ndk ffmpeg linker-errors

我正在尝试构建一个使用FFmpeg本机代码进行视频解码和编码的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");

当我调试时,App在进入本机函数调用时崩溃。我得到以下链接器错误。

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软件包。我收到同样的错误。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

该代码适用于所有Android版本< 23。 即如果您将targetSkdVersion设置为21,则代码将以警告运行。

不幸的是,自Marshmallow(第23版)以来,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。