android NDK jni 사용을 위한 External Tools 설정 및 NDK빌드
android jni 사용을 위한 External Tools 설정하기
이 글은 다른 안드로이드 선배님들의 글을 참고해서 FFmpeg를 빌드하고 JNI를 사용하기 위한 환경을 만들면서 정리해 놓는 초보의 부족한 노트 정리이기 때문에 틀린 내용도 있을 수 있고 부족한 부분이 많으니.... 혹시 이 글을 보시는 분들이 있다면 이해 부탁드리면서...
지난번 글에서는 FFMPEG 형식의 IP Camera를 볼 수 있는 앱을 만들기 위한 준비과정으로 NDK와 FFMPEG를 다운받고 안드로이드 빌드를 진행했었는데요. 오늘은 안드로이드 프로젝트를 생성하고 JNI 형식에 맞는 C언어 헤더 파일을 만들 External Tools를 셋팅 한 후 jni 폴더를 만들고 라이브러리를 불러올 NDK class 작성 및 FFmpeg를 플레이할 C파일 작성 그리고 NDK-Build까지 정리를 해볼 생각입니다. (초보인 제가 나중에 참고하기 위해서 제 머리 속에 정리된 개념대로 작성하는 문장이라서 좀 엉성하네요.ㅎ 하나씩 풀어보죠.)
먼저 프로젝트를 하나 생성하고 Android Studio 왼쪽 Project Structure 창 가장 위쪽에 android 탭을 Project 탭으로 변경합니다.
프로젝트의 모든 경로를 볼 수 있는 좀 더 복잡한 구조로 바뀌는데요. 메뉴 중에서 [Preferences...]로 이동합니다. (Windows를 사용하시면 File > Settings... 를 선택하시면 됩니다.)
Preferences로 이동하면 아래 그림처럼 Tools 밑에서 External Tools를 셋팅할 수 있습니다. [+] 버튼을 눌러서 하나씩 설정해보죠. 저는 이미 설정을 완료한 상태라서 javah, ndk-build, ndk-build clean이 만들어져 있는데요. 이 세 개를 만들 겁니다.
먼저 javah 셋팅입니다.
두 번째는 ndk-build인데요. Program은 NDK 안에 ndk-build 경로를 지정해주면 됩니다.
마직으로 ndk-build clean입니다.
External Tools 셋팅이 끝났으니 프로젝트에 jni 폴더를 만들고.... 라이브러리를 불러오는 역할을 하는 NKD class 파일도 작성하겠습니다.
app > src > main 밑에 jni 폴더를 만들었고요.
app > src > main > java > 패키지 밑에 NDK class 파일을 만들고 그 파일의 내용은 다음과 같이 작성을 합니다.
"VideoPlayer"라는 라이브러리를 불러오고 Player를 실행할 때 필요한 RTSP URL과 Surface를 받아서 실행할 함수들 같네요.
여기까지 작성했으면 JNI 형식에 맞는 C언어 헤더파일을 작성하겠습니다.
NDK class 파일을 오른쪽 클릭해서 External Tools를 선택하고 javah를 선택하면....
jni 폴더에 NKD.h 파일이 만들어지는 걸 확인할 수 있습니다. (저는 FFMPEG 공부하면서 지난 글에서 다운받아 NDK 폴더의 Sources 안에 넣었던 ffmpeg 폴더를 통째로 jni 폴더에 넣어버렸더니 많이 복잡해 보이네요.ㅠㅠ 필요한 파일만 가져와도 되긴 하는데 아직은 그 녀석들의 역할을 제대로 모르고 불안해서 통째로 복사해버렸습니다.ㅎ)
여하튼 만들어진 NDK.h 파일을 잠깐 볼게요.
C언어를 공부한 적 없는 저에게는 너무 어렵게 보이네요. ㅎㅎ 그래도 대충 보니... 앞 NDK class에서 작성했던 함수들을 C언어에 맞게 변환해주고 있는 거 같죠? 이제 이 함수들을 실행할 C 파일을 작성해봅니다.
아이고....ㅠ.ㅠ 너무 복잡해서 초보인 저는 그냥 선배님들이 작성해 놓은 파일을 가져다 쓰는 수밖에 없을 거 같네요. ㅎㅎ 이제 전부가 아니고 아래쪽으로도 더 있는데 혹시 이 소스 파일을 사용하실 분들은....
http://whiteduck.tistory.com/135?category=545232
[이헌제님의 블로그]에서 참고하시면 될 거예요. 저도 이 글의 도움으로 FFMPEG IP Camera를 핸드폰에서 열 수 있었네요. 감사드리며... 위 코드에서 붉게 표시한 것들 중 첫 번째와 네 번째, 다섯 번째는 NDK.h 파일을 참고해서 변경해주면 되고요. 두 번째와 세 번째는 jni를 사용하기 위해서 Native_window를 사용한 점을 참고하기 위해서 표시를 해놨습니다. 이 Native_window.h와 Native_window_jni.h파일을 복사해서 가져와서 프로젝트의 jni에 include 폴더 밑에 android 폴더를 만들고 넣어줘야 하나봐요.
이 파일들은 NDK 폴더 Platforms에 있거든요.
NDK 폴더 > Platforms > android-xx (아무거나 선택하셔도 됩니다. 저는 24로 되어 있네요.) > arch-X86_64 > usr > include > android 폴더 안에 있습니다. 꽤 깊숙이 숨어 있네요. ㅎㅎ 그냥 파일로 검색하면 쉽게 찾을 수 있습니다. 이 두 개의 파일을 프로젝트 jni 폴더로 옮깁니다.
include > android 폴더를 만들어서 그 안으로 옮겼습니다.
이제 NDK-Build를 위한 Android.mk 파일과 Application.mk 파일을 jni 폴더에 만들겠습니다.
jni폴더 오른쪽 클릭해서 New > File을 만들고 다음과 같은 내용으로 채워 넣으면 됩니다. 순서대로 android.mk와 application.mk의 내용입니다.
C 언어를 따로 좀 봐야 하려나 봐요. ㅠㅠ 너무 어려워요.ㅎㅎ 여하튼 두 개의 파일을 이렇게 만든 후 NDK-Build만 하면 됩니다.
jni 폴더를 오른쪽 클릭해서 External Tools를 선택하고요. 앞에서 셋팅 해놨던 ndk-build를 선택하면....
NDK 폴더에 있는 ffmpeg-3.2에서 라이브러리를 가져와서 프로젝트에 설치하는 과정 같죠? 이제 모든 준비가 끝났습니다. ㅎㅎ 다음 글에서는 FFMPEG 형식의 IP Camera를 RTSP로 접근해서 스마트폰에서 열어보는 과정을 정리하기로 하고 이번 글은 여기서 마무리할게요. 수고하셨습니다.