这是一个与视频流程相关的Android应用程序。
使用的库是ffmpeg + x264
,并根据ffmpeg_vitamio的工作松散编译
编译ffmpeg是好的,libffmpeg.so是根据以下内容创建的:
$CC -lx264 -lm -lz -shared --sysroot=$SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $EXTRA_LDFLAGS libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o libavformat/*.o libswresample/*.o libswresample/arm/*.o libswscale/*.o -o $PREFIX/libffmpeg.so
这里要包含的libx264是一个共享库,从libx264.so.130重命名
然后我将libffmpeg.so
放入我的Android项目中。
编译没问题。但是在运行时,错误是:
05-21 13:17:45.066: E/AndroidRuntime(3973): FATAL EXCEPTION: main
05-21 13:17:45.066: E/AndroidRuntime(3973): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libx264.so.130" needed by "libffmpeg.so"; caused by load_library(linker.cpp:745): library "libx264.so.130" not found
我认为在创建libffmpeg.so时,我使用了-lx264 我认为所有链接库都将包含在最终输出库中。
但无论如何,让我试着找出解决方案。 我将libx264.so或libx264.so.130放在几个目录中,例如/ jni,/ libs,/ obj等。
或者我也尝试在jni中的Android.mk中添加-lx264。
但是存在同样的错误。
所以我的问题是: (1)当gcc创建一个共享库时,输出.so库是否包含链接的共享库,这里是libx264.so?
(2)我上面的项目有什么问题?
答案 0 :(得分:3)
当GCC创建一个共享库时,output.so将不包含仅针对静态库发生的链接库,尽管output.so将有一个动态部分,说明它需要的所有库。正确链接。如果你运行
readelf -d libffmpeg.so
它将显示它所需的所有库。现在,链接器尝试链接并加载所有需要的库。在你的情况下,它找不到libx264.so.130,因为它没有包含在你的项目中。
我没有尝试过你正在做的事情,但是将库复制到jni或lib文件夹对我来说无济于事,你必须把它包含在你的make文件中作为PREBUILT_SHARED_LIBRARY。我认为这个链接可能会解决您的问题。 How can i link prebuilt shared Library to Android NDK project?
答案 1 :(得分:1)
@digitzedx,我认为你的答案是对的。所以我按照指令为libx264.so添加prebuild库,就像我为libffmpeg.so做的那样
include $(CLEAR_VARS)
LOCAL_MODULE := libx264_prebuilt
LOCAL_SRC_FILES := libx264.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
然后:
# Note: I have put commands for ffmpeg_prebuilt
LOCAL_SHARED_LIBRARIES := ffmpeg_prebuilt
LOCAL_SHARED_LIBRARIES += libx264_prebuilt
LOCAL_LDLIBS += -llog -ljnigraphics -lz -dl -lx264
include $(BUILD_SHARED_LIBRARY)
在Android src中,添加
System.loadLibrary("x264")
System.loadLibrary("ffmpeg")
System.loadLibrary("native_sample")
构建项目在控制台上显示: 在libs / armeabi-v7a中安装libffmpeg.so,libnative_sample.so,libx264.so,其中libnative_sample.so是我的jni程序。
同样,存在相同的错误:找不到libx264.so.130
我尝试使用不同的LOCAL_LDLIBS订单,它不会改变。
坚持到这里。救命啊!
我想问题可能是: 它正在寻找libx264.so.130,但我只能将该库命名为libx264。 但是readelf -d显示libx264.so中的SONAME是libx264.so.130 不确定systme正在寻找什么,文件名或文件中的SONAME?