Android

[Android] 미리 빌드된 Dynamic Library(so file) Android Project에 추가하는 방법

CommitGuy 2021. 12. 10. 15:39

FFMpeg Library를 Android Project에 사용해야 할 일이 생겨 ffmpeg dynamic library(.so file)를 Android Project에 추가하려다가 글을 써놓으면 다음에 또 추가해야될 일이 생겼을때 해매지 않을것 같아 글을 쓰게 되었습니다.

 

1. ndk Project 생성

 

Native C++로 프로젝트를 생성하게 되면 어느정도 Template이 완성되어 있어 손쉽게 추가할 수 있다.

 

나의 경우 ffmpeg library를 추가해야 하는데 header 파일들(.h file)과 미리 빌드된 동적 라이브러리(.so file)를 추가해줘야 한다.

 

2. header 파일과 동적 라이브러리 Android Project에 추가

Android Project 구성

2-1 header file 추가

'app/src/main/cpp/' 경로에 'include' directory를 만들어준다. 만들어진 include directory에는 필요한 header file 들을 추가해준다

 

2-2 dynamic library (.so file) 추가

미리 빌드된 dynamic library의 경우 'app/src/main/'경로에 'jniLibs' 라는 directory를 만들어 준다

만들어진 jniLibs 아래에는 cpu architecture에 따른 directory를 생성해준다

 

- armeabi-v7a

- arm64-v8a

- x86

- x86_64

 

그리고 빌드된 라이브러리를 각각 빌드된 architecture에 따라 해당 directory에 추가해준다

 

3. CMakeLists 수정

CMake를 수정하여 Library와 Header의 위치를 추가해준다

# Set the location
set(FFmpeg_DIR ${CMAKE_SOURCE_DIR}/../../../src/main/jniLibs)

# Library Header File Location
include_directories(${CMAKE_SOURCE_DIR}/../../../src/main/cpp/include)

# Add ffmpeg Libraries
add_library(lib_avcodec SHARED IMPORTED)
set_target_properties(lib_avcodec PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libavcodec.so)

add_library(lib_avformat SHARED IMPORTED)
set_target_properties(lib_avformat PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libavformat.so)

add_library(lib_avdevice SHARED IMPORTED)
set_target_properties(lib_avdevice PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libavdevice.so)

add_library(lib_avfilter SHARED IMPORTED)
set_target_properties(lib_avfilter PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libavfilter.so)

add_library(lib_avutil SHARED IMPORTED)
set_target_properties(lib_avutil PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libavutil.so)

add_library(lib_swresample SHARED IMPORTED)
set_target_properties(lib_swresample PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libswresample.so)

add_library(lib_swscale SHARED IMPORTED)
set_target_properties(lib_swscale PROPERTIES IMPORTED_LOCATION ${FFmpeg_DIR}/${ANDROID_ABI}/libswscale.so)

target_link_libraries( # Specifies the target library.

        lib_avcodec
        lib_avformat
        lib_avdevice
        lib_avfilter
        lib_avutil
        lib_swresample
        lib_swscale

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

 

4. Gradle 수정

CMake까지 수정한 후 gradle에 몇가지 추가해 준다

ndk {
	abiFilters "arm64-v8a"
}

...........


sourceSets {
	main {
		// let gradle pack the shared library into apk
		jniLibs.srcDirs = ['/src/main/jniLibs']
	}
}

 

이렇게 하고 나면 잘 추가되는것을 확인할 수 있습니다.