[Android] Android NDK - Example1
- Mobile/android
- 2011. 2. 18.
Subject : Android NDK - Example
최종 수정일 : 2011.11.07
- cygwin 에서 ndk-build 명령어를 수행하기 위한 방법(전 몰랐습니다 ㅜㅜ)
이렇게 쉬운거였다니 -_-;; ( 젤아래 포스팅 합니다)
최종 수정일 : 2011. 02. 18
최종 수정일 : 2011.11.07
- cygwin 에서 ndk-build 명령어를 수행하기 위한 방법(전 몰랐습니다 ㅜㅜ)
이렇게 쉬운거였다니 -_-;; ( 젤아래 포스팅 합니다)
최종 수정일 : 2011. 02. 18
안녕하세요~ 앞에 포스팅에 이어서 NDK 를 설치하였는데 어떻게 써먹는지 알아야겠죠??
이번에는 분량이 많은데...
포스팅의 순서가.
1. 후르륵 정리 -> 2. 세부적인 정리(포스팅은 따로) -> 3. 후르륵정리에 링크걸기 를 하려고합니다.
블로그에 이렇게 들어오나 저렇게 들어오나...? 뭐 어짜피 하나라는 것.
정리는 꼼꼼히 하도록 하겠습니다. 이유는... 도서관에서 빌린 책이라서...도로 돌려줘야하니깐...
책은 다시 사기에 돈이~아깝구 그래서 몽땅 정리 해볼까 합니다 .하하하..
이번 NDK 예제를 책에서 따라하고, 인터넷에서 따라하고 엄청난 삽질을 하였네요...
그만큼 이번포스팅은 꼭 제대로 정리하고 만다라고 각오하고 포스팅을 합니다.
이번에는 분량이 많은데...
포스팅의 순서가.
1. 후르륵 정리 -> 2. 세부적인 정리(포스팅은 따로) -> 3. 후르륵정리에 링크걸기 를 하려고합니다.
블로그에 이렇게 들어오나 저렇게 들어오나...? 뭐 어짜피 하나라는 것.
정리는 꼼꼼히 하도록 하겠습니다. 이유는... 도서관에서 빌린 책이라서...도로 돌려줘야하니깐...
책은 다시 사기에 돈이~아깝구 그래서 몽땅 정리 해볼까 합니다 .하하하..
이번 NDK 예제를 책에서 따라하고, 인터넷에서 따라하고 엄청난 삽질을 하였네요...
그만큼 이번포스팅은 꼭 제대로 정리하고 만다라고 각오하고 포스팅을 합니다.
이제 따라 가볼까요?
4. 라이브러리 생성할 소스 디렉토리 생성
# 이제 NDKcalc Project 에서 jni 폴더를 하나 생성을 합니다.
# jni 폴더는 자동으로 생성이 되지 않으므로 수동으로 생성을 해주어야 합니다.
방법은 탐색기 폴더에서 생성하는 것과 아래 프로젝트에서 생성을 할 수 있습니다.
# jni 라고 폴더이름을 적어준다.
# 이제 jni 폴더에 이제 Android.mk 파일을 생성하도록 합니다.
# jni 폴더는 자동으로 생성이 되지 않으므로 수동으로 생성을 해주어야 합니다.
방법은 탐색기 폴더에서 생성하는 것과 아래 프로젝트에서 생성을 할 수 있습니다.
# jni 라고 폴더이름을 적어준다.
# 이제 jni 폴더에 이제 Android.mk 파일을 생성하도록 합니다.
5. Android.mk 설정 파일 생성
Android.mk 파일은 NDK가 make 파일을 이용하여 네이티브코드를 컴파일 하고 빌드할 때 참조하는 파일입니다. 위치는 위의 네이티브 코드가 존재하는 "$Project/jni" 폴더 내에 존재하여야 합니다.(참조[2])
# Android.mk File 작성
# Android.mk File 작성
소스파일 긁어가자!
6. C 소스파일 작성
# calc.c File 작성
C 파일도 새롭게 작성을 하기위해서 파일을 추가합니다. 아무래도 그림이 빠져있으면??? 도대체 어디서 해야하는지 영문을 모르는 분들을 위해서 한장 첨부합니다. (물론 저도 그랬으니깐요 ㅎㅎㅎ)
# 소스 코드 작성
소스 코드를 긁어 볼까요? ( 어디 간지러우신가..맨날 긁어가시게...?)a
C 파일도 새롭게 작성을 하기위해서 파일을 추가합니다. 아무래도 그림이 빠져있으면??? 도대체 어디서 해야하는지 영문을 모르는 분들을 위해서 한장 첨부합니다. (물론 저도 그랬으니깐요 ㅎㅎㅎ)
# 소스 코드 작성
소스 코드를 긁어 볼까요? ( 어디 간지러우신가..맨날 긁어가시게...?)a
7. 소스 컴파일/공유라이브러리 생성
이제 작성할 소스는 다 작성 했죠?
그럼
1. calc.java 파일을 가지고 calc.h 파일을 생성
2. libcalc.so 파일을 생성하기 위한 build
위의 2가지 과정이 남아있군요... 곧 끝나가네요! 휴휴... 새벽 4시... 네트워크 까지 다보고 잘꺼라서..!!
먼저 그림을 보시면 알겠지만
# 현재 경로 확인
(Cygwin/jppark(사용자계정)/Project(생성한프로젝트) 를 Export 해서 넣어두세요)
# 현재 경로를 이동
# javah 명령을 통한 header 파일 생성
# 생성된 Header 파일 확인!
중요한게 아니라 접어둡니다. 간지러우신분은 더보기 클릭!!
왜 간지러우신 분이라고 했는지 이제 이해하시죠? ㅎㅎ 이해가 안되었다면 꼼꼼히 안보셨다는거?
@ 참 파일명이 [패키치]_[클래스이름].h 로 나오게 되어 길게 됩니다.
@ 그래서 [클래스이름].h 로 줄여줍니다.
# 이제 libcalc.so 파일을 생성하기위해서 Bulid 하는 과정을 볼까요!?
# 당연히 그림의 순서대로 가시면 됩니다.
# 현재 경로 확인
# Build 명령 내리기
Build 명령어에 대해서 조금 더 알아 볼까요?
@신규 빌드 작업 : ndk-build
@신규 빌드 및 빌드 명령어 출력 : ndk-build V=1
@이전 바이너리 파일 삭제 : ndk-build clean
@강제 리빌드 작업 : ndk-build -B
@강제 리빌드 및 명령어 출력 : ndk-build -B V=1
@빌드 작업과 NDK 로그 메시지 출력 : ndk-build NDK_LOG=1
@Build 되어 생성된 so 파일 확인
생성되는 파일! 중요하지만 간지러우신 분들만 확인 바랍니다. ㅎㅎㅎ
그럼
1. calc.java 파일을 가지고 calc.h 파일을 생성
2. libcalc.so 파일을 생성하기 위한 build
위의 2가지 과정이 남아있군요... 곧 끝나가네요! 휴휴... 새벽 4시... 네트워크 까지 다보고 잘꺼라서..!!
먼저 그림을 보시면 알겠지만
# [시작]-[Cygwin]-[Cygwin Bash Shell] 을 실행해야겠죠?
# 현재 경로 확인
$pwd
/home/jppark(사용자계정) 으로 나왔네요(Cygwin/jppark(사용자계정)/Project(생성한프로젝트) 를 Export 해서 넣어두세요)
# 현재 경로를 이동
$cd NDKcalc
$cd bin
현재 Project/bin 폴더로 이동을 합니다.$cd bin
# javah 명령을 통한 header 파일 생성
$javah com.tistory.studyandroid.calc
#javah(명령어) [패키지].[클래스이름] 의 순서대로 됩니다.# 생성된 Header 파일 확인!
중요한게 아니라 접어둡니다. 간지러우신분은 더보기 클릭!!
왜 간지러우신 분이라고 했는지 이제 이해하시죠? ㅎㅎ 이해가 안되었다면 꼼꼼히 안보셨다는거?
@ 참 파일명이 [패키치]_[클래스이름].h 로 나오게 되어 길게 됩니다.
@ 그래서 [클래스이름].h 로 줄여줍니다.
# 이제 libcalc.so 파일을 생성하기위해서 Bulid 하는 과정을 볼까요!?
# 당연히 그림의 순서대로 가시면 됩니다.
# 현재 경로 확인
$pwd
/home/jppark/NDKcalc# Build 명령 내리기
$/home/jppark/android-ndk-r5b/ndk-build -B
$/home/jppark(사용자계정)/android-ndk-r5b(NDK 버전에 따라틀림)/ndk-build -B(명렁어)Build 명령어에 대해서 조금 더 알아 볼까요?
@신규 빌드 작업 : ndk-build
@신규 빌드 및 빌드 명령어 출력 : ndk-build V=1
@이전 바이너리 파일 삭제 : ndk-build clean
@강제 리빌드 작업 : ndk-build -B
@강제 리빌드 및 명령어 출력 : ndk-build -B V=1
@빌드 작업과 NDK 로그 메시지 출력 : ndk-build NDK_LOG=1
@Build 되어 생성된 so 파일 확인
생성되는 파일! 중요하지만 간지러우신 분들만 확인 바랍니다. ㅎㅎㅎ
8. Native 메소드 호출
# NDKcalc.java File
본문의 소스내용을 작성합니다. Native 가 사용된 곳에 표시를 해두겠습니다.
본문의 소스내용을 작성합니다. Native 가 사용된 곳에 표시를 해두겠습니다.
9. 결과 확인
휴...드디어 결과를 보는군요...!!! 행복합니다.
# 실행 할 줄은 알죠? 현재 3일 공부한 저두 하는데~ 이런건 기본이죠?
# 아아앗!? 그런데 왜 에러인가요!?
물론 블로그에 있는 내용을 긁어다가 사용하신 분들이라면 될려나? 좀 많이 간지럽죠. 이렇게 글을 계속 읽고 있다는 것은,,,안된다는 뜻이 아닐까 싶기도 한데(앗! 그냥 혼잣말이에요, 기분나빠하지 마시길^^;;)
에효..에러가 떳으니 왜 떳는지..알아봐야하겠죠?
그나저나...저 포스팅을 하는 지금.. 하루만에 찾기는 했지만, 도통 NDK 의 구조가 갈피도 잡히지도 않고, 인터넷에 아무리 검색해봐도 되지도 않고,, 그렇다고 인터넷에 따라해도 되지도 않고...그러더군요...
현재 포스팅을 하는 초기에도 몰랐습니다. 물론 제가 스스로 간지러워서 젤처음에 이야기한 프로젝트를 제가 직접 만들면서 캡처를 한다고 이야기를 하였는데.. 지금의 에러가 어디서 나는지 찾기 위해서 이런 삽질을 하고 있습니다. 60억 인구중에 누군가가 똑같은 에러를 만날테고...같은 생각을 하고 있을테니깐요...
같은 생각을 하는 이유는 같은 행동을 하고 같은 것을 바라보고 같은 것을 먹고...등등...
그러하니깐요...아무도 나와 같은 생각을 할 수 없게 하려면 ?... 어떻게 해야할까요?
무념무상..?? <-- 꼬숙이(후배)가 말하는 저말이..정답일지...갑자기 생각나서 주절주절....
그만큼 -_-..지금 일어난 에러에 대해서...한이 좀 맺혀있나보네요...
참...정확하지는 않지만 에러는 금방 잡았습니다. 이유가 이유라면 잘못적은 오타 라고 보시면되죠..
확인 해볼까요?
# 아아앗!? 그런데 왜 에러인가요!?
물론 블로그에 있는 내용을 긁어다가 사용하신 분들이라면 될려나? 좀 많이 간지럽죠. 이렇게 글을 계속 읽고 있다는 것은,,,안된다는 뜻이 아닐까 싶기도 한데(앗! 그냥 혼잣말이에요, 기분나빠하지 마시길^^;;)
에효..에러가 떳으니 왜 떳는지..알아봐야하겠죠?
그나저나...저 포스팅을 하는 지금.. 하루만에 찾기는 했지만, 도통 NDK 의 구조가 갈피도 잡히지도 않고, 인터넷에 아무리 검색해봐도 되지도 않고,, 그렇다고 인터넷에 따라해도 되지도 않고...그러더군요...
현재 포스팅을 하는 초기에도 몰랐습니다. 물론 제가 스스로 간지러워서 젤처음에 이야기한 프로젝트를 제가 직접 만들면서 캡처를 한다고 이야기를 하였는데.. 지금의 에러가 어디서 나는지 찾기 위해서 이런 삽질을 하고 있습니다. 60억 인구중에 누군가가 똑같은 에러를 만날테고...같은 생각을 하고 있을테니깐요...
같은 생각을 하는 이유는 같은 행동을 하고 같은 것을 바라보고 같은 것을 먹고...등등...
그러하니깐요...아무도 나와 같은 생각을 할 수 없게 하려면 ?... 어떻게 해야할까요?
무념무상..?? <-- 꼬숙이(후배)가 말하는 저말이..정답일지...갑자기 생각나서 주절주절....
그만큼 -_-..지금 일어난 에러에 대해서...한이 좀 맺혀있나보네요...
참...정확하지는 않지만 에러는 금방 잡았습니다. 이유가 이유라면 잘못적은 오타 라고 보시면되죠..
확인 해볼까요?
etc. 에러난 이유를 알아보자.
# 에러가 어디서 난 것일까?
천천히 하나씩 살펴 보았습니다. 삽질을 하는 지금까지, 똑같은 프로젝트를 몇번이나 만들어 보았을까요?
#calc.java File 입니다.
@: ㅡㅡ^ 아래의 그림을 보시면, 생성된 library 파일은 libcalc.so 입니다.
@ 즉, NDKcalc 라는 파일이름은 이미 현재 파일 추가가 되어있는 Zip 내의 내용입니다(과거의 내용).
이러한 상황이 왜 발생했냐? 책이랑 인터넷이랑 보고 여러번 프로젝트 만들면서 복사/붙여넣기를 하면서 수정하지 않은 탓이지요...(물론 제잘 못입니다. 누구나가 처음에 범하는 실수죠...)
@ 그렇다면...누군가가 좀 명시를 해줘야 하지 않나? 이건 주의사항으로 좀 알려 달란!! 이런 말입니다.
그래서...
# java header 파일을 다시 생성 함
java header 파일을 수정하였으므로 다시 생성하도록 합니다.
# 에러가 발생한 곳이 하나 더 잇었네요..^^;;
현재 본 포스팅의 5번째 C소스 파일 작성을 보면 아래 그림에 붉은색으로 밑줄 그어져 있는 부분과 다르다는 것을 알게 될 것입니다.완전 초보적인 실.수. 네요... 당연히 전 안드로이드를...보는 3일 초짜입니다. 물론...개발자로서는 오래 있었을지도 모르지만요..(비참하군요..이런 실수를 한다는게..)
# 프로젝트 ReBuild 하기
C 소스 코드를 수정하였으므로 so 파일을 다시 생성을 해야겠죠?
아래의 그림과 같이 다시 빌드를 합니다.
천천히 하나씩 살펴 보았습니다. 삽질을 하는 지금까지, 똑같은 프로젝트를 몇번이나 만들어 보았을까요?
#calc.java File 입니다.
@: ㅡㅡ^ 아래의 그림을 보시면, 생성된 library 파일은 libcalc.so 입니다.
@ 즉, NDKcalc 라는 파일이름은 이미 현재 파일 추가가 되어있는 Zip 내의 내용입니다(과거의 내용).
이러한 상황이 왜 발생했냐? 책이랑 인터넷이랑 보고 여러번 프로젝트 만들면서 복사/붙여넣기를 하면서 수정하지 않은 탓이지요...(물론 제잘 못입니다. 누구나가 처음에 범하는 실수죠...)
@ 그렇다면...누군가가 좀 명시를 해줘야 하지 않나? 이건 주의사항으로 좀 알려 달란!! 이런 말입니다.
그래서...
@주의사항
1. Header 파일을 생성하기위한 calc.java 파일과 생성되는 lib(header name).so 파일명은 일치해야한다.
설명이 부족하네요...
Header 파일을 생성하기 위한 java header 에 사용된 이름과, 빌드를 통하여 생성된 so 파일의 이름은 아래와 같아 야 한다는 공식입니다.
# 간결하지 못한 느낌인데... 더 적었다간 해깔릴 것이라 생각 되어 이만 작성합니다.
1. Header 파일을 생성하기위한 calc.java 파일과 생성되는 lib(header name).so 파일명은 일치해야한다.
설명이 부족하네요...
Header 파일을 생성하기 위한 java header 에 사용된 이름과, 빌드를 통하여 생성된 so 파일의 이름은 아래와 같아 야 한다는 공식입니다.
java header Vs Library.so File
HeaderName = libHeaderName.so
HeaderName = libHeaderName.so
# 간결하지 못한 느낌인데... 더 적었다간 해깔릴 것이라 생각 되어 이만 작성합니다.
# java header 파일을 다시 생성 함
java header 파일을 수정하였으므로 다시 생성하도록 합니다.
# 에러가 발생한 곳이 하나 더 잇었네요..^^;;
현재 본 포스팅의 5번째 C소스 파일 작성을 보면 아래 그림에 붉은색으로 밑줄 그어져 있는 부분과 다르다는 것을 알게 될 것입니다.완전 초보적인 실.수. 네요... 당연히 전 안드로이드를...보는 3일 초짜입니다. 물론...개발자로서는 오래 있었을지도 모르지만요..(비참하군요..이런 실수를 한다는게..)
# 프로젝트 ReBuild 하기
C 소스 코드를 수정하였으므로 so 파일을 다시 생성을 해야겠죠?
아래의 그림과 같이 다시 빌드를 합니다.
휴..드디어 끝이났다. 이제 결과를 보도록 할까요?
디자인은 별로지만! 끝을 제대로 확인하지 않으셨던가요!?
#결과 화면
결과를 보셨으니 행복하시죠!?
그리고..전 새벽 5시가 되어서 포스팅이 끝이 나네요...
아직 포스팅이 끝났다고는 말못합니다.
NDK 에 대한 빠진 내용을 책을 참조해서 다시 계속 정리를 할 것이니깐요...
그럼 계속...열심 히! 포스팅 하는 것 기대해 주시기 바랍니다.(헐...3시간 걸렸네..ㅜㅜ)
결과를 보셨으니 행복하시죠!?
그리고..전 새벽 5시가 되어서 포스팅이 끝이 나네요...
아직 포스팅이 끝났다고는 말못합니다.
NDK 에 대한 빠진 내용을 책을 참조해서 다시 계속 정리를 할 것이니깐요...
그럼 계속...열심 히! 포스팅 하는 것 기대해 주시기 바랍니다.(헐...3시간 걸렸네..ㅜㅜ)
2011.11.07
cygwin 에서 ndk-build 명령어 수행을 위한 방법
방법은 간단합니다.(....)ㅠ
시스템 환경 변수 PATH 에 NDK 경로를 추가해 주면 됩니다.
exmaple 을 보셔야 이해 하시겠죠?
(현재 위에랑 setting 을 바꾸었습니다. )
.bashrc 파일에서
export ANDROID_NDK_ROOT=/home/android-ndk-r6b 경로 수정
(실제 C:\cygwin\home\android-ndk-r6b 입니다.)
그리고 시스템 [내컴퓨터]-[환경변수]-[PATH] 란에
C:\cygwin\home\android-ndk-r6b 를 넣어줍니다.
아아 그림이 없으니 내가 알아보기도 힘들겠다....
그리고 .bashrc 파일에
export PATH=$PATH:/home/jppark/android-ndk-r5b (이전 버전) 이렇게 추가하면 되는거 같은데
안되나보네..ㅡ.ㅡ.... 파일에서 path 거는 방법 아시는분 댓글 좀 부탁들비니다^^
이상~!!
Reference
[1] cwisky@paran.com 님의 블로그 ( http://micropilot.tistory.com/1522 )
- 아무래도 책 2권의 NDK 를 보고, 구글에서 검색된 포스팅인데...의외로 꼼꼼히 정리가 잘되어 있었습니다. 하지만 처음 보는 저한테 이미지가 부족한 ㅜ_ㅜ 조금더 제가 꼼꼼히 작성해보리라 ...합니다.
[2] 전문가로 가는 안드로이드 마스터 프로젝트 (주) 교학사
- 도서관에서 NDK 가 있어서 빌린 책입니다. 가지고 있는 안드로이드 책 한권으로 부족함을 느끼고, 인터넷을 찾아보면서 하는 것도 한계가 있기 때문에 도서관을 찾아나섰습니다. 책을 빌려놓고 한달간 보지도 않았네요..그리고 특강을 듣기 시작하면서 보게 되었는데...물론 필요한 부분만^^;; 그래도 그냥 버린게 아니라서 다행이네요..
[1] cwisky@paran.com 님의 블로그 ( http://micropilot.tistory.com/1522 )
- 아무래도 책 2권의 NDK 를 보고, 구글에서 검색된 포스팅인데...의외로 꼼꼼히 정리가 잘되어 있었습니다. 하지만 처음 보는 저한테 이미지가 부족한 ㅜ_ㅜ 조금더 제가 꼼꼼히 작성해보리라 ...합니다.
[2] 전문가로 가는 안드로이드 마스터 프로젝트 (주) 교학사
- 도서관에서 NDK 가 있어서 빌린 책입니다. 가지고 있는 안드로이드 책 한권으로 부족함을 느끼고, 인터넷을 찾아보면서 하는 것도 한계가 있기 때문에 도서관을 찾아나섰습니다. 책을 빌려놓고 한달간 보지도 않았네요..그리고 특강을 듣기 시작하면서 보게 되었는데...물론 필요한 부분만^^;; 그래도 그냥 버린게 아니라서 다행이네요..
_M#]
'Mobile > android' 카테고리의 다른 글
Android JavaCV (1) | 2011.05.12 |
---|---|
[Android] Android - OpenCV Setting (83) | 2011.02.26 |
[Android] Android - 단축키 (0) | 2011.02.18 |
[Android] Android NDK - Setting 편 (9) | 2011.02.18 |
Android - LinearLayout (0) | 2011.02.16 |