[컴][안드로이드] Android NDK FFmpeg 컴파일






Android NDK 설치


설치환경

  • os : ubuntu 64bit

ndk package

에서 download 하자.


android-ndk-r10d-linux-x86_64.bin 를 다운로드하고 설치하자. 대략 3.6GB 가 필요하다. 파일에 실행권한을 주고, 실행하면, 그 폴더 안에서 압축이 풀린다.
여기서는
  • /home/namh/android/ndk/android-ndk-r10d
에 설치되었다.


참고로, 현재(2015년 1월) 는 아래버전이 ndk 의 최신버전이다.
  • Android NDK, Revision 10d (December 2014)


ffmpeg 설치 및 빌드

FFmpeg

여기에 가서 FFmpeg 의 소스를 다운로드 하자. 그리고 ndk folder 안에 sources 에 소스를 풀어놓자.
  • /home/namh/android/ndk/android-ndk-r10d/sources/ffmpeg-2.5.3
현재(2015-01-25) stable version 이 2.5.3 이다. 이것을 사용하자.



configure file

ffmpeg 의 configure file 을 열자. 경로는 아래와 같다.
  • d:\Program Files\Android\ndk\android-ndk-r10d\sources\ffmpeg-2.5.3\configure
그리고 아래 # 부분을 수정해 주자. 저부분이 compile 후에 나오는 .so 파일의 이름을 정해준다.[ref. 1]

# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'



Build ffmpeg

ref. 1 에서 build_android.sh 를 가져오자.
그리고 거기서 아래처럼 NDK path 만 다시 설정해 주자.
NDK=$HOME/android/ndk/android-ndk-r10d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
그리고 configure file 이 있는 곳으로 가서 실행하자. 20분은 안걸린다.(vm 에서 cpu core 2 개, i3 2100 인 경우)

그러면 아래 경로에서 결과 file 을 찾을 수 있다.
  • $NDK/sources/ffmpeg-2.0.1/android


jni 빌드

ndk-build 를 위해 필요한 파일

  • Android.mk / Application.mk / jnitest.c
  • $NDK/sources/ffmpeg-2.5.3/android/arm/Android.mk
예제 소스는 아래 Example Source 를 참고하자.



$NDK/sources/ffmpeg-2.5.3/android/arm/Android.mk

  • $NDK/sources/ffmpeg-2.5.3/android/arm/Android.mk

를 추가한다. 참고로 LOCAL_SRC_FILES 의 이름은
  • $NDK/sources/ffmpeg-2.5.3/android/arm/lib

에 있는 .so 파일의 이름과 같아야 한다.

Android.mk

LOCAL_PATH:= $(call my-dir)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-5.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-1.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)


이렇게 하고, jni 라는 이름의 folder 를 하나 만들고,
.c file + Android.mk + Applicaiton.mk 파일들을 만들어 그 안에 놓자.

Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := tutorial01
LOCAL_SRC_FILES := tutorial01.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz 
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil

include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.5.3/android/arm)


Application.mk

APP_ABI := armeabi
#APP_ABI := armeabi-v7a
APP_PLATFORM := android-10

이제 ndk-build 를 실행하면, .c file 이 compile 된다. 그리고 필요한 lib 들이 copy 된다.


여기서 ./libs 와 ./jni 부분을 android project 로 가져오면 된다.


Example source





windows + cygwin 

아래 page 에서 windows 에서 cygwin 을 사용해서 compile 하는 방법이 나와있다.
  1. Android NDK FFmpeg 컴파일 강좌 (1/4) 남은그루터기, 2011.07.10 08:12:05
  2. Android NDK FFmpeg 컴파일 강좌 (2/4) 남은그루터기, 2011.07.10 18:51:03
  3. Android NDK FFmpeg 컴파일 강좌 (3/4) 남은그루터기, 2011.07.11 05:02:12
  4. Android NDK FFmpeg 컴파일 강좌 (4/4) 남은그루터기, 2011.07.11 05:20:38


References

  1. How to Build ffmpeg with NDK r9 | roman10




댓글 없음:

댓글 쓰기