初めまして、Android開発で壁にぶつかってしまい、ここに質問投稿させていただきました。
(問題)
FFMpegの機能をAndroidアプリで使いたく、AndroidNDK環境でFFMpegのビルドを行おうとしています。
Webでいろいろと調べ、ビルドまではいけるのですが、実際に動かそうとすると 、
System.loadLibrary("avcodec");
を実行時に、以下のエラーとなりアプリケーションが終了してしまいます。
---
E/AndroidRuntime(9011): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1937]: 225 could not load needed library 'libavutil.so.51' for 'libavcodec.so' (load_library[1092]: Library 'libavutil.so.51' not found)
---
開発環境は以下のとおりです。
OS:CentOS6.3
ADT:Build v22.0.1-685705
android-ndk-r8e
Android端末:Galaxys3
(手順)
1.https://github.com/yixia/FFmpeg-Android からソースを取得し、FFmpeg-Android.shを実行
(ffmpegのAndroid向けビルド(so ファイル)が生成される)
2.自NDKアプリのjniフォルダ下に1.で生成したライブラリとインクルードフォルダをコピー
[jni/libの下]
libavcodec.a
libavcodec.so -> libavcodec.so.54.41.100
libavcodec.so.54 -> libavcodec.so.54.41.100
libavcodec.so.54.41.100
libavformat.a
libavformat.so -> libavformat.so.54.17.100
libavformat.so.54 -> libavformat.so.54.17.100
libavformat.so.54.17.100
libavutil.a
libavutil.so -> libavutil.so.51.65.100
libavutil.so.51 -> libavutil.so.51.65.100
libavutil.so.51.65.100
libffmpeg.so
libswresample.a
libswresample.so -> libswresample.so.0.15.100
libswresample.so.0 -> libswresample.so.0.15.100
libswresample.so.0.15.100
libswscale.a
libswscale.so -> libswscale.so.2.1.100
libswscale.so.2 -> libswscale.so.2.1.100
libswscale.so.2.1.100
(includeフォルダ以下は省略)
3.Android.mkファイルを編集(下記)
Android.mkファイル---->
LOCAL_PATH := $(call my-dir)
#static version of libavutil
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil.so
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_EXPORT_LDLIBS := libavutil.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := lib/libavcodec.so
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_EXPORT_LDLIBS := libavcodec.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
#static version of libavformat
include $(CLEAR_VARS)
LOCAL_MODULE:= avformat
LOCAL_SRC_FILES:= lib/libavformat.so
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_EXPORT_LDLIBS := libavformat.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
#static version of libswscale
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale.so
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_EXPORT_LDLIBS := libswscale.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := lib/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_EXPORT_LDLIBS := libffmpeg.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
#ffmpeg-jni library
include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
LOCAL_MODULE := FFsample
LOCAL_SRC_FILES := FFsample.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lavutil -lavcodec -lswscale -llog -ljnigraphics -lz -ldl -lgcc -ffmpeg-prebuilt -landroid
LOCAL_ARM_MODE := arm
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/cpufeatures)
<---EOF
4.MainのActivityにて、 System.loadLibrary()で、自JNIおよびffmpeg関連のライブラリを指定する。;
static {
System.loadLibrary("avutil");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");
System.loadLibrary("FFsample");
}
5.ビルド
ビルドは成功
(ビルドログ)
**** 自動ビルド of configuration デフォルト for project FFsample ****
/home/****/android-ndk-r8e/ndk-build all
Install : libFFsample.so => libs/armeabi/libFFsample.so
Install : libavcodec.so => libs/armeabi/libavcodec.so
Install : libavformat.so => libs/armeabi/libavformat.so
Install : libavutil.so => libs/armeabi/libavutil.so
Install : libffmpeg.so => libs/armeabi/libffmpeg.so
Install : libswscale.so => libs/armeabi/libswscale.so
Build Finished (took 399ms)
上記の各.soファイルは obj/local/armeabi/objsの下に配置されています。
ココまではいけたのですが、実行時に上記した通りのエラーとなってしまいます。
上記のエラー「 could not load needed library 'libavutil.so.51' for 'libavcodec.so' 」はWebで検索すると、幾つか情報があったのですが、これといって有用な解決方法を見つけられないでいます。
思い当たる解決方法、あるいは、AndroidNDKでFFmpegのビルド手順を説明しているサイトなどご存知でしたらご教授いただけないでしょうか?
よろしくお願いします。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。