Art of Pr0gr4m

NDK를 이용한 애플리케이션 만들기 (CMake) 본문

IT/Android

NDK를 이용한 애플리케이션 만들기 (CMake)

pr0gr4m 2016. 11. 5. 06:37

과거 안드로이드 스튜디오에서 NDK를 이용하여 애플리케이션 만드는것이 쉽지만은 않은 일이었지만 안드로이드 스튜디오 2.2버전부터는 CMake를 이용하여 매우 쉽게 NDK를 사용할 수 있게 되었습니다.


사실 프로젝트 생성 화면에서부터 C++를 이용한다고 체크하면 기본 골격은 만들어져 나오기 때문에 가이드라인이 필요 없을 정도지만, 혹시 가이드라인이 필요하신 분에게 참고가 되었으면 하여 글을 작성합니다.



1. NDK 설치


NDK에 필요한 Tools는 SDK Manager에서 간단하게 설치할 수 있습니다.



SDK 매니저의 SDK Tools 카테고리에서 CMake, LLDB, NDK 세 필드에 체크 하고 Apply를 누르시면 설치가 진행됩니다.



2. NDK 프로젝트 생성


NDK를 이용한 기본 골격은 프로젝트 생성할 때 다음과 같이 Include C++ Support에 체크만 해주시면 전부 지원해 줍니다.



다른 부분은 전부 디폴트 설정으로 해두고 넘기셔도 됩니다.

다음 페이지에서는 사용할 C++ 표준을 고를 수도 있습니다.



만들어진 프로젝트를 빌드하고 실행시키면 다음과 같은 결과를 볼 수 있습니다.




NDK를 이용한 프로젝트 생성과 빌드 및 실행은 이렇게 끝이 납니다.



3. NDK 프로젝트 제어


프로젝트 만들기는 너무 쉽게 만들었지만, 세부 사용법을 알지 못하면 원하는 상황에서 제대로 적용을 할 수가 없습니다.

사용법은 역시나 안드로이드 공식 홈페이지의 레퍼런스를 참조하면 되지만 NDK 부분은 아직 번역이 되어 있지 않습니다.

따라서 어수룩한 영어 실력이지만 필요한 부분부터 제가 한 번역을 첨부하겠습니다.

(번역할 레퍼런스 원문 주소는 https://developer.android.com/studio/projects/add-native-code.html 입니다.)






Create a New Project with C/C++ Support



네이티브 코드를 포함한 프로젝트를 만드는 것은 creating any other Android Studio project와 유사하지만, 몇가지 단계가 추가로 존재합니다:


1. 새로운 프로젝트 설정에서, Include C++ Support에 체크하세요.

2. Next를 누릅니다.

3. 다음 단계들을 평범하게 진행하세요.

4. Customize C++ Support 단계에서, 다음 옵션을 변경할 수 있습니다:

- C++ Standard: 드랍 리스트에서 어느 C++ 표준을 사용할지 정할 수 있습니다. Toolchain Default를 선택하면 기본적인 CMake 설정을 사용합니다.

- Exceptions Support: C++의 예외 처리를 사용하고 싶다면 체크하세요. 사용한다면 안드로이드 스튜디오가 -fexceptions플래그를 모듈 레벨 build.gradle파일의 cppFlags에 추가할 것입니다.

- Runtime Type Information Support: RTTI를 지원하고 싶다면 체크하세요. 사용한다면 안드로이드 스튜디오가 -frtti플래그를 모듈 레벨 build.gradle파일의 cppFlags에 추가할 것입니다.

5. Finish를 누르세요


안드로이드 스튜디오가 프로젝트 생성을 완료한 후, IDE 좌측의 Project pane의 Android 뷰를 열어보세요. 안드로이드 스튜디오가 cppExternal Build Files 그룹을 추가한 것을 볼 수 있습니다:


Figure 2. Android view groups for your native sources and external build scripts.


Note: 이 그림이 실제 디스크의 파일 구조를 반영하지는 않습니다. 그러나 당신의 간단한 프로젝트와 비슷하긴 할겁니다.


cpp 그룹은 네이티브 소스 파일, 헤더, 빌드된 라이브러리가 포함되는 장소입니다. 새로운 프로젝트에서, 안드로이드 스튜디오는 샘플 C++ 소스 파일인 native-lib.cpp를 생성하고 이것을 앱 모듈의 src/main/cpp/ 디렉토리에 위치시킵니다. 이 샘플 코드는 "Hello from C++"라는 string을 반환하는 심플한 C++ 함수인 stringFromJNI()를 제공합니다. Create new native source files 섹션에서는 어떻게 새로운 소스 파일을 프로젝트에 추가할 수 있는지를 배울 수 있습니다.


② External Build Files 그룹은 CMake나 ndk-build와 같은 빌드 스크립트가 위치하는 장소입니다. build.gradle 파일이 Gradle에 빌드 방법을 전달하는 것과 비슷하며, CMake와 ndk-build는 어떻게 네이티브 라이브러리를 빌드할지를 요구합니다. 새로운 프로젝트에서 안드로이드 스튜디오는 CMake 빌드 스크립트인 CMakeList.txt를 만들고 이 것을 모듈의 루트 디렉토리에 위치시킵니다. 빌드 스크립트에 대해서는 Create a Cmake Build Script에서 더 배울 수 있습니다.



Build and run the sample app


Run run then run app from the menu bar 을 누르면, 안드로이드 스튜디오는 앱을 빌드하고 실행시켜서 에뮬레이터나 디바이스에 "Hello from C++"을 보여줍니다. 아래 과정은 샘플 앱을 빌드하고 실행하기 위한 과정을 설명합니다:


1. Gradle이 외부 빌드 스크립트인 CMakeList.txt를 불러옵니다.

2. CMake가 빌드 스크립트에 따라 C++ 소스 파일인 native-lib.cpp을 컴파일하여, 라이브러리 파일인 libnative-lib.so로 만들고, Gradle은 이를 APK에 패키지화합니다.

3. 실행 중에는, 앱의 MainActivitySystem.loadLibrary()를 사용하여 네이티브 라이브러리를 load합니다. 라이브러리의 네이티브 함수인  stringFromJNI()는 앱에서 사용될 수 있습니다.

4. MainActivity.onCreate() stringFromJNI()를 call 하여 “Hello from C++”를 반환받고, 이 문자열을 이용하여 TextView를 업데이트 합니다.

Note: Instant Run 은 네이티브 코드를 사용하는 프로젝트에 적합하지 않습니다.


Gradle이 APK에 네이티브 라이브러리를 포함하는지 확인하고 싶으면, APK Analyzer를 사용할 수 있습니다:


1. Build > Analyze APK를 선택합니다.

2. app/build/outputs/apk/ 디렉토리에 있는 APK를 선택하고 OK를 누릅니다.

3. 다음과 같이 lib/<ABI>/ 아래에 libnative-lib.so 파일을 볼 수 있습니다. 


Figure 3. Locating a native library using the APK Analyzer.


Tip: 다른 안드로이드 앱에서 네이티브 코드를 사용해보고 싶다면, File > New > Import Sample을 누르고 Ndk 리스트에서 샘플 프로젝트를 선택하세요.



Add C/C++ Code to an Existing Project



기존 프로젝트에 네이티브 코드를 추가하고 싶으면, 다음 절차를 따라하세요:


1. Create new native source files를 진행하고 안드로이드 스튜디오 프로젝트에 추가합니다.

- 이미 네이티브 코드가 존재하거나 prebuilt된 네이티브 라이브러리를 사용하려 한다면 이 단계를 생략할 수 있습니다.

2. Create a CMake build script를 통해서 네이티브 소스 코드를 빌드하여 라이브러리에 추가합니다. 또한 prebuilt나 platform 라이브러리들을 importing 하거나 linking 할 때에도 빌드 스크립트는 필요합니다.

- 이미 CMakeList.txt 빌드 스크립트를 포함한 네이티브 라이브러리나 Android.mk 빌드 스크립트를 포함한 ndk-build로 만들어진 네이티브 라이브러리가 존재한다면, 이 과정은 생략할 수 있습니다.

3. CMake나 ndk-build 스크립트 파일에 경로를 제공하여 Link Gradle to your native library 를 진행하세요. Gradle은 빌드 스크립트를 사용하여 네이티브 라이브러리(SO file)를 APK에 포함시킬 것입니다.


프로젝트 설정을 진행하면, 자바 코드에서 JNI framework를 이용하여 네이티브 함수에 접근할 수 있습니다. 프로젝트를 빌드하고 앱을 실행하려면 간단하게 Run run then run app from the menu bar을 클릭하세요. Gradle은 네이티브 라이브러리의 컴파일, 빌드, 패키지화에 대한 의존성을 고려하여 외부 네이티브 라이브러리를 APK에 추가할 것입니다.


Create new native source files


cpp/ 디렉토리와 앱 모듈의 main sourceset에 포함되는 새로운 네이티브 소스 파일을 만들려면 다음 과정을 따라하세요:


1. IDE 왼쪽 측면에 있는 Project pane을 열어서 drop-down 메뉴의 Project view를 선택하세요.

2. your-module > src를 따라가서, main 디렉토리를 우클릭하고, New > Directory를 선택하세요.

3. cpp/ 같은 디렉토리 이름을 입력하고 OK를 누르세요.

4. 만들었던 디렉토리를 우클릭하고 New > C/C++ Source File을 선택하세요.

5. native-lib 와 같은 소스 파일 이름을 입력하세요. 

6. Type drop-down 메뉴에서, .cpp 와 같은 소스 파일의 확장자를 선택하세요.

- drop-down 메뉴에서 Edit File Types  를 누르면 .cxx.hxx 와 같은 다른 타입을 추가할 수 있습니다. 

7. 소스파일에 연관된 헤더 파일을 함께 만들고 싶다면, Create an associated header에 체크하세요.

8. OK를 누르세요.


Create a CMake build script


네이티브 소스파일이 CMake 빌드 스크립트를 가지고 있지 않으면, 적절한 CMake 커맨드를 가진 파일을 만들어야 합니다. CMake 빌드 스크립트는 평범한 텍스트 파일인데, 파일 이름은 CMakeList.txt 여야 합니다. 이 섹션은 CMake가 네이티브 라이브러리를 만들기 위한 빌드 스크립트에 포함될 기본 문법들을 설명합니다.


Note: 프로젝트가 ndk-build를 사용한다면, CMake 빌드 스크립트를 만들 필요는 없습니다. Android.mk 파일을 이용하여 link Gradle to your native library를 진행할 수 있습니다.


CMake 빌드 스크립트를 위한 텍스트 파일을 만들고 아래 내용을 진행합니다:


1. IDE 왼쪽 측면에 Project pane을 열어서 drop-down 메뉴의 Project view를 선택합니다.

2. your-module 의 루트 디렉토리를 우클릭하고 New > File를 선택합니다.

Note: 빌드 스크립트를 어디에 만들어도 상관은 없습니다. 그러나 빌드 스크립트 설정 시에 소스 파일들의 경로가 빌드 스크립트 파일의 위치 관계를 고려해야 합니다.

3. 파일 이름을 "CMakeList.txt"로 하고 OK를 누르세요.


빌드 스크립트에 CMake 커맨드를 추가하여 빌드 설정을 할 수 있습니다. CMake가 네이티브 소스코드로 네이티브 라이브러리를 만들게 지시하려면, 빌드 스크립트에 cmake_minimum_required()add_library() 커맨드를 추가해야 합니다:


# 네이티브 라이브러리를 빌드하기 위하여 CMake가 요청하는 최소한의 버전을 설정하세요. # This ensures that a certain set of CMake features is available to # your build. cmake_minimum_required(VERSION 3.4.1) # Specifies a library name, specifies whether the library is STATIC or # SHARED, and provides relative paths to the source code. You can # define multiple libraries by adding multiple add.library() commands, # and CMake builds them for you. When you build your app, Gradle # automatically packages shared libraries with your APK. add_library( # 라이브러리의 이름을 지정합니다. native-lib # 공유 라이브러리로 만들 것인지 설정합니다. SHARED # 소스파일들의 상대 경로를 지정합니다. src/main/cpp/native-lib.cpp ) 


소스 파일이나 라이브러리를 CMake 빌드 스크립트에 추가할 때 add_library()를 사용합니다. 안드로이드 스튜디오는 프로젝트 안에 있는 연관된 헤더 파일을 찾습니다.  CMake가 컴파일 하는 동안 헤더 파일을 제대로 찾을 수 있게 하려면, include_directories() 커맨드를 추가하여 헤더 파일의 경로를 알려줘야 합니다.


add_library(...)

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

CMake가 만드는 라이브러리 파일의 이름은 보통 다음과 같습니다.


liblibrary-name.so


예를 들어 빌드 스크립트에서 공유 라이브러리의 이름을 native-lib라고 했다면, CMake는 라이브러리 파일의 이름을 libnative-lib.so로 만듭니다. 하지만 이를 Java 코드에서 로딩할 때에는 빌드 스크립트에 지정한 대로 사용해야 합니다.


static {
   
System.loadLibrary(“native-lib”);
}

Note: CMake 빌드 스크립트의 라이브러리 이름을 수정하거나 지우려면, Gradle이 APK에서 번경 사항을 적용하기 전에 clean project를 수행해야 합니다. clean project를 하기 위하여, 메뉴바의 Build > Clean Project 를 선택하세요.


안드로이드 스튜디오는 소스 파일이나 헤더 파일을 Project pane의 cpp 그룹에 자동으로 추가합니다. add_library() 커맨드를 여러번 사용하여 다른 소스파일을 사용해서 추가적인 라이브러리를 정의할 수 있습니다.


Add NDK APIs


안드로이드 NDK는 유용한 네이티브 API와 라이브러리를 제공합니다. 프로젝트의 CMakeLists.txt 스크립트 파일에 the NDK libraries를 포함시키는 것으로 이 API들을 사용할 수 있습니다.


안드로이드 플랫폼에 Prebuilt NDK 라이브러리가 이미 존재한다면, 다시 빌드하거나 APK에 패키지화 할 필요는 없습니다. NDK 라이브러리들이 이미 CMake의 검색 경로에 존재하기 때문에, 로컬 NDK 설치 위치를 지정할 필요도 없습니다. —단지 사용하고 링크하려는 라이브러리의 이름을 CMake에 제공해주면 됩니다.


CMake 빌드 스크립트에 find_library() 커맨드를 이용하여 NDK 라이브러리의 위치를 지정하고 이것을 변수로 저장할 수 있습니다. 빌드 스크립트의 다른 부분에서 NDK 라이브러리르 참조하는데 이 변수를 사용할 수 있습니다. 다음 샘플은 Android-specific log support library 를 찾아서 log-lib에 이 경로를 저장합니다:


find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )

네이티브 라이브러리에서 log 라이브러리의 함수를 사용하려면, CMake 빌드 스크립트에 target_link_libraries() 커맨드를 사용하여 라이브러리를 링크해야 합니다:


find_library(...)

# Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
                       native-lib

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

NDK는 또한 소스코드를 빌드하여 만든 라이브러리를 네이티브 라이브러리에 링크할 수 있습니다. CMake 빌드 스크립트에서 add_library() 커맨드를 사용하여 소스 코드를 컴파일하여 네이티브 라이브러리로 만들 수 있습니다. 로컬 NDK 라이브러리에 경로를 제공하려면, 안드로이드 스튜디오가 자동으로 정의하는 ANDROID_NDK 경로 변수를 사용할 수 있습니다.


다음 커맨드는 CMake에서 NativeActivity의 라이프사이클 이벤트와 터치 입력을 관리하는 소스인 android_native_app_glue.c를 빌드하여 static 라이브러리로 만들고 native-lib에 링크합니다:


add_library( app-glue
             STATIC
             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )

Add other prebuilt libraries


prebuilt 라이브러리를 추가하는 것은 CMake에 다른 네이티브 라이브러리를 추가하는 것과 비슷합니다. 그러나 라이브러리가 이미 빌드되어 있기 때문에, IMPORTED 플래그를 사용하여 단지 라이브러리를 프로젝트에 추가만 하겠다는 것을 알려줘야 합니다:


add_library( imported-lib
             SHARED
             IMPORTED )

그리고 아래에서 보이는 것처럼 set_target_properties() 커맨드를 이용하여 라이브러리의 경로를 지정해야 합니다.


일부 라이브러리들은 특정 CPU 아키텍처를 위한 분리된 패키지나 Application Binary Interfaces (ABI)를 분리된 디렉토리로 제공합니다. 이러한 접근 방식은 원하는 버전의 라이브러리만 사용할 수 있게 하기 때문에 특정 CPU 아키텍처를 사용함에 있어 이점을 갖습니다. 여러 버전의 ABI를 빌드 스크립트에 따로 작성하지 않고 한번에 추가하려면 ANDROID_ABI 경로 변수를 사용할 수 있습니다. 이 변수는 기본적인 ABIs that the NDK supports 리스트를 사용하거나, manually configure Gradle 에 추가한 ABI 리스트를 사용합니다. 예를 들면 다음과 같습니다:


add_library(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

컴파일 하는 동안 CMake가 헤더 파일을 찾기 위해서, include_directories() 커맨드를 이용하여 헤더 파일의 위치를 알려줘야 합니다:


include_directories( imported-lib/include/ )

Note: 빌드 타임에 종속성이 없는 prebuilt 라이브러리를 추가하고 싶다면 다음 명령을 수행할 필요는 없습니다.


prebuilt 라이브러리를 네이티브 라이브러리에 링크하고 싶으면, target_link_libraries() 커맨드에 추가하세요:


target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

앱을 빌드할 때 Gradle은 imported 라이브러리를 자동적으로 APK에 패키지화 합니다. APK Analyzer를 이용하여 Gradle이 APK에 어떤 라이브러리들을 포함시켰는지 알 수 있습니다. CMake 커맨드에 대하여 더 알아보고 싶으면 다음 링크를 참조하세요. CMake documentation."


Link Gradle to your native library


Gradle에 네이티브 라이브러리들을 링크하고 싶다면 CMake나 ndk-build 스크립트 파일의 경로를 알려줘야 합니다. 앱을 빌드할 때, Gradle은 종속성을 고려하여 CMake나 ndk-build를 작동시키며, APK에 공유 라이브러리를 포함시킵니다. Gradle은 또한 파일들을 안드로이드 스튜디오의 Project 창에서 보여주고 접근하기 위하여 빌드스크립트를 사용합니다. 네이티브 소스코드들에 대한 빌드 스크립트가 존재하지 않는다면 create a CMake build script 를 먼저 진행해야 합니다.


Gradle에 네이티브 프로젝트를 링크시키면 안드로이드 스튜디오는 Project pane을 업데이트 하여 cpp 그룹에 네이티브 소스 파일들과 라이브러리들을 보여주며, External Build Files 그룹에 외부 빌드 스크립트를 보여줍니다.


Note: Gradle의 내용이나 설정을 바꾸면 툴바에 있는 Sync Project 를 눌러서 수정 사항을 적용시키세요. 또한 이미 Gradle에 추가시켰던 CMake나 ndk-build의 빌드 스크립트를 바꾸려면, 안드로이드 스튜디오의 메뉴바에 있는 Build > Refresh Linked C++ Projects 를 이용하여 Sync를 진행해야 합니다.


Use the Android Studio UI


안드로이드 스튜디오의 UI를 이용하여 Gradle에 CMake나 ndk-build를 링크할 수 있습니다:


1. IDE의 좌측에 있는 Project pane 를 열어서 Android view를 봅니다.

2. 링크하려고 하는 네이티브 라이브러리 모듈을 우클릭하고 메뉴에 있는 Link C++ Project with Gradle 를 누르세요. figure 4에서 보이는 대화를 볼 수 있습니다.

3. drop-down 메뉴에서 CMakendk-build를 선택하세요.

a. CMake를 선택했다면 Project Path에 외부 CMake 프로젝트를 위한 CMakeLists.txt 스크립트 파일의 경로를 지정하세요.

b. ndk-build를 선택했다면 Project Path에 외부 ndk-build 프로젝트를 위한 Android.mk 스크립트 파일의 경로를 지정하세요. 안드로이드 스튜디오는 Android.mk 파일이 존재하는 디렉토리에 존재하는 Application.mk 파일 또한 사용할 것입니다.

Figure 4. 안드로이드 스튜디오 대화상자를 이용한 외부 C++ 프로젝트 링크.


4. OK를 누르세요.


Manually configure Gradle


Gradle에 직접 네이티브 라이브러리를 링크하려면, 모듈 레벨의 build.gradle 파일에 externalNativeBuild {} 블록 에다가 cmake {}ndkBuild {} 설정을 이용하여 추가해야 합니다:


android {
 
...
  defaultConfig
{...}
  buildTypes
{...}

 
// Encapsulates your external native build configurations.
  externalNativeBuild
{

   
// Encapsulates your CMake build configurations.
    cmake
{

     
// Provides a relative path to your CMake build script.
      path
"CMakeLists.txt"
   
}
 
}
}

Note: Gradle에 이미 존재하는 ndk-build 프로젝트를 링크하고 싶으면, cmake {} 대신에 ndkBuild {} 를 사용하고, Android.mk 파일의 상대 경로를 입력하세요. Gradle은 같은 디렉토리에 존재하는 Application.mk 파일도 같이 사용할 것입니다.


Specify optional configurations


모듈 레벨의 build.gradle 파일의 defaultConfig {} 블락 안의 externalNativeBuild {} 블락에 CMake나 ndk-build 설정을 위한 옵션이나 플래그들을 지정할 수 있습니다. defaultConfig {} 블락의 다른 프로퍼티들과 비슷하게 이 특성들을 각각의 product flavor에 맞게 오버라이드 할 수 있습니다.


예를들어 CMake나 ndk-build 프로젝트가 여러 네이티브 라이브러리들을 정의하려면, 주어진 product flavor에 해당하는 라이브러리 집합을 빌드하고 패키지하기 위하여 targets 프로퍼티을 사용할 수 있습니다. 아래의 샘플 코드는 가능한 프로퍼티 설정의 예시를 보여줍니다:


android {
 
...
  defaultConfig
{
   
...
   
// This block is different from the one you use to link Gradle
   
// to your CMake or ndk-build script.
    externalNativeBuild
{

     
// For ndk-build, instead use ndkBuild {}
      cmake
{

       
// Passes optional arguments to CMake.
        arguments
"-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

       
// Sets optional flags for the C compiler.
        cFlags
"-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"

       
// Sets a flag to enable format macro constants for the C++ compiler.
        cppFlags
"-D__STDC_FORMAT_MACROS"
     
}
   
}
 
}

  buildTypes
{...}

  productFlavors
{
   
...
    demo
{
     
...
      externalNativeBuild
{
        cmake
{
         
...
         
// Specifies which native libraries to build and package for this
         
// product flavor. If you don't configure this property, Gradle
         
// builds and packages all shared object libraries that you define
         
// in your CMake or ndk-build project.
          targets
"native-lib-demo"
       
}
     
}
   
}

    paid
{
     
...
      externalNativeBuild
{
        cmake
{
         
...
          targets
"native-lib-paid"
       
}
     
}
   
}
 
}

 
// Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild
{
    cmake
{...}
   
// or ndkBuild {...}
 
}
}
product flavor과 build variants에 대해 더 배우려면 다음 링크를 참조하세요; Configure Build Variants. CMake의 arguments 프로퍼티에 사용할 수 있는 변수들의 목록을 보고싶다면 다음 링크를 참조하세요; Using CMake Variables.

Specify ABIs

기본적으로, Gradle은 네이티브 라이브러리를 ABIs the NDK supports 를 위한 분리된 .so 파일로 빌드하고 APK에 모두 다 패키지화 합니다. Gradle이 특정 네이티브 라이브러리의 특정 ABI로만 빌드하게 하고 싶다면, 아래에 보이는 것처럼 모듈 레벨의 build.gradle 파일에 ndk.abiFilters 플래그를 지정할 수 있습니다:

android {
 
...
  defaultConfig
{
   
...
    externalNativeBuild
{
      cmake
{...}
     
// or ndkBuild {...}
   
}

    ndk
{
     
// Specifies the ABI configurations of your native
     
// libraries Gradle should build and package with your APK.
      abiFilters
'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   
'arm64-v8a'
   
}
 
}
  buildTypes
{...}
  externalNativeBuild
{...}
}
위에서 보이는 것처럼 abiFilters를 설정하면 Gradle이 네이티브 라이브러리의 해당 버전들로 빌드하고 패키지하기 때문에 대부분의 경우에서는 ndk {} 블락에만 abiFilters를 지정해도 됩니다. 그러나 Gradle이 빌드하는것과 독립적으로 APK에 패키지하는 것을 설정하고 싶다면 defaultConfig.externalNativeBuild.cmake {} 블락이나 defaultConfig.externalNativeBuild.ndkBuild {} 블락에 또 다른 abiFilters 플래그를 사용해야 합니다. Gradle은 해당 ABI 설정들로 빌드를 하지만 defaultConfig.ndk{} 블락에 지정된 것들로 패키지를 구성할 것입니다.

APK의 사이즈를 줄이기 위하여, configuring ABI APK splits 를 고려해 보세요 - Gradle은 모든 버전의 네이티브 라이브러리들을 포함한 큰 APK 대신에, 필요한 ABI 파일들만 사용하여 ABI 버전마다 분리된 APK를 만듭니다. 위의 샘플 코드처럼 abiFilters 플래그를 이용해서 ABI를 나누지 않으면, Gradle은 모든 네이티브 라이브러리의 모든 ABI 버전으로 빌드하지만 그 중 ABI split 설정에 지정한 것만 패키지에 포함시킵니다. 필요없는 버전의 네이티브 라이브러리 빌드를 피하려면,  abiFilters 플래그와 ABI split 설정 양쪽에 같은 ABI 리스트를 작성하세요.




4. 마무리


이렇게 프로젝트를 한번 만들어보시고, 레퍼런스를 보면서 사용법을 익히시면 NDK 사용에는 큰 무리가 없을겁니다.

다만 PC에서 빌드한 라이브러리를 사용하는 등의 특수한 상황에서는 여러 문제가 발생할 수 있는데, 해당 상황에 대해서는 따로 포스팅 하겠습니다.

그리고 당연하지만 번역에 이상이 있으면 지적해주시면 감사드리겠습니다.

'IT > Android' 카테고리의 다른 글

NDK를 이용한 애플리케이션 만들기 (ndk-build)  (0) 2016.11.08