Android Studio 2.2 에서 NDK 빌드하기

(외부 prebuilt 파일 추가하기 .so)




Android Studio 는 너무나 자주 바뀐다


Android Studio 를 3년 넘게 쓰고있는데, 매번 느끼는거지만 너무 자주 바뀝니다. -_-;

물론 자주 바뀌는건 좋다고 생각합니다. 상황과 시대가 바뀌므로 그에 맞게 변화하는건 좋은 것이지요.

다만,, 개발자 입장에서는 너무나 괴롭습니다.


저는 프로젝트를 처음 시작할때에는 알고있는 것도,

새로운 트렌드나 변경된게 있는지 찾아보는 습관을 가지고 있습니다.



이번에 Android 에서 OpenAL 관련하여 ndk 빌드를 할 일이 생겼습니다.

마침 몇달전 Android Studio 2.2 (Stable Version)로 버전업이 되면서, ndk 관련 수정된게 있다는 소식을 듣고 있던터라,,

ndk 빌드관련해서 검색해 보았습니다.



역시나.... 새로운 feature 가 추가되었습니다.





CMakeLists.txt 를 사용하자


Android Studio는 기존에 ndk 를 빌드하는 방식이 이미 여러차례 바뀐 경력을 가지고 있습니다.

이번엔 Android Studio 에서 본격적으로 c++ 빌드를 지원하는데요.

ndk 빌드를 위해서 CMakeLists.txt 를 지원합니다.(cmake)


전에 Andriod.mk 파일을 쓰던 방식이 바뀌었단 이야깁니다.


관련된 문서는 아래 url 에서 확인 가능합니다.


https://developer.android.com/studio/projects/add-native-code.html




간략히 환경설정에 대해서 짚고 넘어가겠습니다.





환경설정


1. 먼저 Android Studio 를 2.2 이상으로 업데이트 합니다.

2. SDK Tools 에서 아래 3가지를 항목을 찾아서 추가로 설치합니다.

1. LLDB

2. CMake

3. NDK

3. 이제 Android Studio 에서 새 프로젝트를 생성하면, 아래처럼 C++ 항목이 하나 추가됨을 알 수 있습니다.


"Include C++ Support" 를 체크하고, 프로젝트를 생성하면, 기본적인 CMakeLists.txt 파일과 /src/main/cpp 폴더아래 native-lib.cpp 가 있는것을 확인 할 수 있습니다.


gradle 파일을 열어보면, externalNativeBuild 의 프로퍼티가 추가된 것도 확인할 수 있습니다.



이렇게 총 3가지가 크게 추가/변경되었습니다.

1. "cpp" 폴더가 있음.

2. "CMakeLists.txt" 가 있음.

3. gradle 에 "externalNativeBuild -> cmake" 속성이 추가됨.






외부 Library 파일(.so) 추가하여 build 하기


위 내용까지 빌드+실행은 매우 잘 됩니다.


그러나~!!!!!!

외부 빌드된 library 파일(.so)을 추가해서 cpp 빌드를 하려고 하면,,

거지같은 상황에 부딪히게 됩니다.


도대체 이 .so 파일을 어떻게 추가해야 하는가???

하라는대로 다 했는데도.. 도통 reference 를 찾지 못합니다.


여기서 빡치기 시작합니다.

자료를 찾으려고 해도, 불과 길어야 두달? 정도 된 내용이라....

정보가 없습니다 -_-;;


어쩔수 없이 삽질해야 합니다.



아무튼 수많은 착오끝에 빌드에 성공하였습니다.

기본적인 CMakeLists.txt 에 대한 내용은 아래 사이트에 나와 있습니다.



https://developer.android.com/studio/projects/add-native-code.html



해 보세요.

더럽게 안됩니다. ㅎ.




아무튼 결론만 적겠습니다.




1. .so 파일을 적당한 위치에 넣습니다.

 - 제 경우에는 src/main/cpp 아래 jniLibs 폴더를 만들고 그 안에 각 ABI 에 맞게 so 파일을 넣었습니다.

 - 말씀드렸듯이 '적당한 곳'에 넣으시면 됩니다. 기존 방식대로 jniLibs 를 java 와 동일한 레벨에 넣어도 됩니다.


2. .so 에 대한 header 파일을 적당한 위치에 넣습니다.

 - 제 경우에는 src/main/cpp 아래에 넣었습니다.


3. CMakeLists.txt 파일에 아래를 추가 합니다.

add_library( openal-lib

             SHARED

             IMPORTED )


set_target_properties(openal-lib

                       PROPERTIES IMPORTED_LOCATION

                       ../../../../src/main/cpp/jniLibs/${ANDROID_ABI}/libopenal.so)


include_directories( src/main/cpp/AL )


4. 그리고 target_link_libraries 라는 곳에 openal-lib 를 추가해 줍니다.

target_link_libraries( # Specifies the target library.

                        native-lib

                        openal-lib

                       # Links the target library to the log library

                       # included in the NDK.

                       ${log-lib} )



여기서 openal-lib 를 제가 정한 이름입니다. 여러분 상황(.so 라이브러리)에 맞게 바꾸시면 됩니다.

욕나오는 부분은..


위에 빨간색 부분입니다.

경로가 저렇더라고요. -_-+


왜 다른 파일들은 모두 root 가 app module 기준인데, 외부 so 파일은 저런 이상한 곳이 root 인지 모르겠습니다.

아니면 속 편하게, 혼자개발 하실거라면~ full path 를 적어주시면 됩니다.


E:/Development/Android/src/main/cpp/jniLibs/${ANDROID_ABI}/libopenal.so

이런식으로요.



추가로 말씀드릴 부분은 저처럼 모든 ABI 에 대해서 so 파일이 없는 경우에는 gradle 에서 abiFilters 를 통해 존재하는 ABI 만 걸어주시면 됩니다. 이 부분은 안드로이드 메뉴얼에서 읽어보세요~



마지막으로..여러분 이해를 돕기위해서 스샷 올려드립니다.

요즘들어 포스팅이 워낙 귀찮아서;;; 뒤죽박죽에 대충대충이네요 ㅎ.