출처 - http://blog.naver.com/dev4unet/220511848528
버섯돌이의 안드로이드 기초 Android Studio에서 NDK 환경 구축하기 : Hello NDK(JNI) |
오늘은 안드로이드 스튜디오에서 NDK를 설정하는 방법 및 간단한 Hello JNI 예제를 살펴보겠습니다.
지난 시간에 학습했던 OpenCV의 NDK 예제를 사용하기 위한 기초를 겸하지만 NDK에 대한 자세한 내용은 다루지 않습니다.
이번 강좌에서는 안드로이드 개발 방법중 하나인 NDK에 대한 조금의 이해와 함께 안드로이드 스튜디오의
Hello JNI 샘플 소스를 사용해서 안드로이드 샘플 소스를 사용하는 방법도 덤으로 살펴 볼 예정입니다.
기존 강좌와 동일한 방식으로 NDK를 빌드 하기 위한 환경이 구축되어 있지 않아서 발생하는 오류를 처리하는 방법을 통해
비슷한 환경에서 스스로의 에러 처리 능력을 향상시키며, 안드로이드 스튜디오와 조금 더 친해질 수 있길 기대해 봅니다.^^;;
그 외의 자체적으로 해결 불 가능한 문제들은 검색 신 님께 부탁하시는 방법 외에는~ *^^*V
본 강좌를 통해 다음과 같은 학습 효과를 기대해 봅니다.
- NDK에 대한 간단한 이해
- 안드로이드 샘플 코드 활용 방법
- NDK 설치 방법
- NDK 환경 설정 및 에러 처리 능력
- 스마트폰 없이 테스트하는 방법
3. NDK 환경 구축 요약..
지루한 글을 읽기 싫은 분들을 위해 본 강좌의 핵심은 아래 내용이 전부입니다.
- File > Settings.. 메뉴 선택
- 좌측 트리 메뉴에서 "Apperance & Behavior > System Settings > Android SDK"를 선택
- 우측 화면에서 "SDK Tools" 탭을 선택
- 우측 화면의 SDK 툴 목록에서 Android NDK 선택 후 설치
- 안드로이드 스튜디오 재시작
4. SDK, NDK, PDK란?
안드로이드 스택 [그림 출처 : 안드로이드 사이트]
안드로이드의 아키텍처는 HAL의 포함 유무에 따라 아래 그림처럼 크게는 4계층이나 5계층으로 구분합니다.
안드로이드 아키텍처 다이어그램
그림 출처 : https://en.wikipedia.org/wiki/Android_(operating_system)
안드로이드의 경우 개발 방식에 따라 크게는 SDK, NDK, PDK의 3가지로 나눌 수 있는데
위 아키텍처 다이어 그램에서 주의 깊게 살펴봐야 할 부분은 라이브러리와 애플리케이션 프레임워크 계층입니다.
초록색의 라이브러리 계층은 네이티브라고도 표현하는데 C/C++로 만들어졌으며, JNI(Java Native Interface)를 통해서 호출됩니다.
파란색의 애플리케이션 프레임워크 계층은 Java로 만들어진 라이브러리라고 보시면 되는데,
안드로이드는 하드웨어 드라이버를 C로 만들었기 때문에 Java와 C/C++ 사이의 연결고리 역할을 하기 위해 JNI가 존재합니다.
이 두 계층의 개발 방법에 따라 SDK와 NDK의 필요성이 구분된다고 보시면 됩니다.
PDK(Platform Development Kit)의 경우 보통 안드로이드 전체 소스를 의미합니다.
SDK와 NDK를 포괄하여 가장 강력하며 복잡한 방식으로 주로 안드로이드를 포팅 할 때 사용됩니다.
하드웨어를 제어하거나 드라이버와 HAL 부분을 작성할 때 사용 가능한데, 앱 개발자들에게 플랫폼의 허용 범위 안에서
안드로이드 앱을 개발하도록 API를 간추려서 배포되는 게 SDK와 PDK입니다.
SDK(Software Development kit)의 경우 안드로이드에서 제공하는 API를 사용하는 일반적인 앱 개발 방식입니다.
애플리케이션과 애플리케이션 프레임워크 계층을 사용하며, SDK가 제공하는 범위에서만 개발이 가능하나 가장 안정적입니다.
NDK(Native Development Kit)의 경우 PDK와 SDK의 중간 위치 정도로서 애플리케이션 프레임워크와 라이브러리 계층을 사용합니다.
안드로이드 환경에서 C나 C++ 언어로 작성된 네이티브 코드를 사용할 수 있도록 도와주는 툴이라고 보시면 됩니다.
자바에서 JNI를 통해 C/C++에서 만든 함수를 직접 호출한다고 생각하시면 될 듯 싶은데...
만사 귀찮고 복잡하니 .so 파일을 만드는 게 목적이라고 생각하면 될 듯싶습니다.^^
NDK는 게임 같은 고성능이 필요한 경우에 사용하지만 SDK 만으로는 구현이 어렵거나
기존에 만들어져있는 무수히 많은 C 기반의 라이브러리 등을 안드로이드에서 사용하기 위해 주로 사용합니다.^^
다만, NDK를 사용한다고 해서 반드시 성능이 향상된다는 보장은 없으므로 SDK에서 제공하는 기능이 있고,
성능 등 특별히 불편하지 않다면 굳이 위험을 감수하며 NDK로 만들 필요는 없습니다.
설명 중 틀린 부분도 있을 듯싶으니 그러려니... 하면서 읽고 잊어버리세요.^^
그냥.. 너무 복잡하다면 안드로이드에서 C/C++을 사용하려면 NDK~~ 만 기억하시면 충분할 것 같습니다.
5. 사전 준비 사항..
이전 강좌를 참고 하셔서 안드로이드 스튜디오를 설치해 주세요~
http://blog.naver.com/dev4unet/220486468813
참고로, 저는 본 강좌를 사용하기 위해 윈도우즈 10에 안드로이드 스튜디오 최신 버전을 오늘(2015-10-17) 새로 설치했습니다.^^
안드로이드 스튜디오만 설치를 완료한 상태라 진행시 추가로 더 설치되는 부분들도 있을 것이며...
안드로이드 스튜디오가 버전 변화에 민감하다 보니 워낙 변화 무쌍해서 문제가 발생하는 부분들이 다르기 때문에
제 강좌를 보는 시점에 따라서 안드로이드 스튜디오의 버전에 따른 문제들도 있을 텐데 적절히 해결하시기 바랍니다.^^
안드로이드 스튜디오에 NDK는 설치하지 않은 상태로 따라 해주세요~~~
6. 안드로이드 샘플 이용하기..
기존 강좌를 참고해서 안드로이드 스튜디오를 실행합니다.
안드로이드 샘플 소스를 사용하기 위해 첫 웰컴 화면에서 "Import an Android code sample"을 선택합니다.
안드로이드 스튜디오는 최초 구동시 가장 마지막에 사용했던 프로젝트 파일을 자동으로 불러오도록 되어 있어서,
웰컴 화면이 안 나오는 분들도 계실 텐데 열려있는 프로젝트를 닫으시면 웰컴 화면이 나옵니다. ( File > Close Project )
웰컴 화면 외에도 "File > New > Import Sample.." 메뉴를 통해서도 실행할 수 있습니다.
각자 편한 방법으로 Import Sample 창을 실행하시면 됩니다.
좌측 트리 메뉴에서 Ndk 항목 하위에 있는 "Hello JNI"를 선택합니다.
(이곳에는 NDK 외에도 다양한 샘플 예제가 많으니 참고하셔서 활용하시기 바랍니다.^^)
Next를 클릭합니다.
애플리케이션 이름을 적당히 입력하시고 "Finish" 버튼을 클릭합니다.
GitHub에서 소스를 다운로드하는 걸 알 수 있습니다.
따라서, GitHub에서 직접 내려받으셔도 동일합니다.^^;;
잠시 후, Hello JNI 프로젝트가 로드됩니다.
7. NDK 설치..
안드로이드 스튜디오 프로젝트 파일이라서 아무런 에러 없이 로드됩니다.*^^*
But, 저희는 아직 NDK를 설치하지 않아서 NDK 에러가 발생하는군요.
지난 시간에 학습했듯이 에러가 발생하는 경우 대 부분 빨간색 부분을 클릭하면 해결이 가능하니 "Select NDK"를 클릭합니다.
NDK를 새로 설치할 것인지... 아니면 기존에 설치된 NDK를 등록할 것인지 선택하는 NDK 선택 화면이 나오는군요.
NDK도 SDK와 마찬가지로 개별로 설치해서 경로를 설정할 수 있습니다만...
일단, 다른 내용과 연장선에 있어서 위 메뉴는 이번 강좌에서 사용하지 않고 다른 방법을 사용하겠습니다.
이곳에서도 설치가 가능하다는 사실만 확인하시고 Cancel 버튼을 클릭해서 창을 닫습니다.
다른 방법으로 NDK를 설치하기 위해 "File > Settings.." 메뉴를 선택합니다.
단축키는 "Ctrl+Alt+S" 입니다.
자주 사용하는 메뉴 중 하나라서 외워두면 좋을듯싶네요.^^
안드로이드 스튜디오 설정 화면입니다.
좌측 트리 메뉴에서 "Apperance & Behavior > System Settings > Android SDK"를 선택합니다.
우측 화면에서 "SDK Tools" 탭을 선택합니다.
SDK Tools 메뉴의 내용을 자세히 보기 위해 해당 화면만 캡처했습니다.
이곳은 Android SDK Manager 화면으로서 사용 가능한 안드로이드 SDK에 관한 정보가 나열되어 있음을 알 수 있습니다.
목록의 가장 마지막에 있는 "Android NDK"를 보면 아직 설치되어 있지 않군요.*^^*V
직감적으로 "Android NDK"의 체크 박스를 선택하면 설치가 될 것 같은 느낌이 팍팍~ 오죠~
이때 설치되는 버전은 1.0.0입니다.
"Android NDK"의 체크 박스를 선택하면 "Apply" 버튼이 활성화됩니다.
Apply 버튼을 클릭하세요.
Android NDK version 1.0.0을 설치할 것인지 다시 한번 확인하는 창이 나옵니다.
"OK"를 클릭하면 설치가 진행됩니다.
이젠 Android NDK의 설치가 끝났습니다.
마지막에 Done. 문구와 1 개의 패키지가 설치되었다는 내용이 보이는군요.
Finish 버튼을 클릭합니다.
SDK Tools 탭의 마지막 목록 내용을 보면 "Android NDK"의 설치가 완료되어있습니다.
아직 제대로 반영되지 않는 부분들이 있으므로 재시작하기 위해 안드로이드 스튜디오를 종료합니다.
8. 빌드 툴 리비전 문제 해결..
안드로이드 스튜디오를 다시 실행합니다.
얏호~ NDK 오류가 사라졌습니다.
하지만... 제공되는 안드로이드 샘플 소스와 사용 중인 빌드 툴의 리비전이 맞지 않아서 새로운 에러가 발생하는군요.*^^*V
최신 버전만 사용할 때의 문제입니다.^^;;;
에러 해결 방법은 같은 방법으로 에러가 발생한 부분을 클릭해서 "23.0.0" 리비전의 빌드 툴을 설치하면 됩니다.
23.0.0 버전의 빌드 툴이 설치되었으니 Finish 버튼을 클릭해서 창을 닫고 안드로이드 스튜디오를 재시작하시면 에러는 해결됩니다.
하지만, 사용하는 시점에 따라서는 구 버전이 없거나, 구 버전을 사용하고 싶지 않은 경우가 있을 수 있으니
OpenCV 환경을 설정했을 때처럼 이번에도 조금 다른 방법을 살펴보겠습니다.
좌측 프로젝트 트리에서 "local.properties(SDK Location)"을 더블 클릭하면 NDK와 SDK의 설치 경로를 확인할 수 있습니다.
위에서 설치했던 NDK가 어디에 설치되어 있는지 알 수 있겠죠.
이번 강좌에서는 필요 없지만 프로젝트에 따라서는 경로를 확인해야 할 필요가 있어서 잠깐 설명하고 넘어갑니다.*^^*V
그럼 이번에는 "23.0.0" 빌드 툴 리비전 오류를 설치된 버전에 맞도록 해결하는 방법을 살펴보겠습니다.
"app > src > build.gradle"을 더블 클릭합니다. (OpenCV SDK 설치 때 해 봤죠? 복습입니다~)
이곳에 buildToolsVersion이 "23.0.0"으로 설정되어 있습니다.
따라서, 컴퓨터에 설치된 버전은 몇 버전인지 확인해서 제대로 된 리비전 버전으로 수정해야 합니다.
설치된 빌드 버전을 확인하기 위해 툴바에서 "SDK Manager" 아이콘을 클릭합니다.
좀 전에 NDK를 설치하기 위해 왔던 화면이니 친숙하죠*^^*
이번에는 세부 정보를 확인하기 위해 "Launch Standalone SDK Manager" 링크를 클릭합니다.
"Android SDK Manager"가 새 창으로 실행되었습니다.
리비전 정보인 "Rev." 컬럼을 주의 깊게 살펴봅니다.
Tools 항목에서 "Android SDK Build-tools" 항목을 보면 다양한 버전이 존재하지만...
제 경우 설치된(Status 항목이 Installed인) 버전은 "23.0.1" 버전 하나뿐이군요.
따라서, 제 경우에는 리비전이 "23.0.0" 이 아니라 "23.0.1" 를 사용해야 합니다.
buildToolsVersion 값을 "23.0.0" 에서 "23.0.1"로 수정후 상단 알림 창의 "Try Again" 링크를 클릭합니다.
하단의 그레이들 빌드 상황을 보면 에러 없이 완료되었군요.
다만, 제 경우 안드로이드 스튜디오만 설치해서 그런지 그레이들 설정 관련해서 알림 메시지가 나오네요.
ㅋㅋㅋ.. 설치하라고 하면 바로 설치하는 버섯입니다.*^^*V
안드로이드 스튜디오 사용 환경에 따라서 나오는 분도 계실 테고 안 나오는 분도 계실 테니 적당히~
이젠 모든~~ 에러가 다 사라졌습니다.*^^*
사진과 글이 길어서 그렇지 사실 클릭 몇 번만 하면 되는 아주 간단한 내용이라 참 쉽죠~?
9. 동작 확인 및 응용..
이젠 확인을 위해 실행만 하면 됩니다.
상단의 시작 아이콘을 클릭하시거나 단축 아이콘 Shift+F10을 이용해서 앱을 실행합니다.
앱을 실행할 디바이스를 선택하는 화면입니다.
안드로이드 스튜디오만 설치했어도 "Nexus 5" 가상 단말이 설치되기 때문에 "Launch emulator"를 선택 후 "OK"를 선택합니다.
가상 단말과 관련한 간단한 설명은 이전 글을 참고 하시기 바라며... http://blog.naver.com/dev4unet/220500633392 가상 단말이 아닌 스마트폰에서 실행하는 방법은 아래 글을 참고 하세요. |
안드로이드 모니터 창에 열심히 정보가 출력되며 잠시 후 가상 단말이 구동됩니다.
쨔쟌~!!!
Hello JNI 성공입니다.*^^*V
가상 단말은 초기 부팅 속도가 느리기 때문에 에뮬레이터에서 테스트를 계속하시려면...
결과 확인 후 가상 단말 실행을 바로 종료하지 말고 계속 띄워놓고 작업하세요^^
NDK를 모르기도 하지만 NDK 문법 및 소스 작성 방법 등을 다루기에는 양이 너무 방대하므로....
항상 그렇듯이 이번에는 "Hello from JNI"의 내용을 "Hello Dev4unet JNI"로 바꿔 보겠습니다.
좌측 프로젝트 창에서 "app > jni > hello-jni.c" 파일을 더블 클릭합니다.
뭔가 복잡한 내용과 함께 친숙한 문자열이 보이는군요.
"Hello from JNI"의 내용을 "Hello Dev4unet JNI"로 변경 후 안드로이드 앱을 다시 실행합니다~
만약, 앞에서 실행했던 가상 단말을 종료하지 않았으면 이번에는 상단의 실행 중인 장치 목록에서 선택할 수 있습니다.
상단에서 구동할 가상 안드로이드를 선택하고 OK를 클릭합니다.
이번에는 이미 가상 단말이 기동되어 있는 상태라 빠르게 결과를 확인할 수 있습니다.
Hello Dev4unet JNI로 잘 바뀌어있군요.*^^*V
A. 마치며..
NDK를 학습하려면 안드로이드 스튜디오 외의 NDK와 관련된 툴부터 C 문법을 비롯한 다양한 개념까지 알아야 할 내용들이 많습니다만
귀차니즘에 안드로이드 스튜디오와 NDK에 대해 학습하지 않고 그냥 툴을 만지작거리면서 삽질한 내용만 공유할 뿐이라
잘 못된 정보가 있을 수 있으니 NDK에 대한 자세한 내용은 온라인의 다른 강좌나 서적 들을 참고 하시기 바랍니다.
'개발 > 안드로이드' 카테고리의 다른 글
GSON 사용법 (0) | 2015.11.20 |
---|---|
이클립스(eclipse)에서 C++ 설치 및 간단 사용법(MinGW) (0) | 2015.11.10 |
사인한 키스토어(keystore) 확인하기 (0) | 2015.10.28 |
새로운 안드로이드 마시멜로 샘플 앱 (0) | 2015.10.21 |
안드로이드 언어 코드 (0) | 2015.09.08 |
댓글