주의.
본 내용은 예전버전으로 설치내용이 다소 변경될 수 있습니다. 다른블로그 가는것을 권장합니다^^ |
Android With OpenCV using NDK - (1)
일단 OpenCV 제외하고 NDK 부터 돌려보도록 한다.
Android-NDK : 이것또한 안드로이드 사이트에서 제공한다.
http://developer.android.com/tools/sdk/ndk/index.html
Platform 에 맞는 것을 다운로드 하면 되게쪄~
cygwin : 리눅스 환경처럼 만들어서 make파일을 만드나...
OpenCV-Android는
http://sourceforge.net/projects/opencvlibrary/files/opencv-android/
에서 알아서 다운로드~
보통 모든 중심은 cygwin 에서 이루어진다
Opencv나 ndk 모두
콘솔창에서 편리한 처리를 하기위해 주로 (Cygwin설치폴더)/home/계정이름/ 내에 모든것을 배치한다.
/home/계정이름/OpenCV2.3.1
/home/계정이름/Android-ndk-r7-....
/home/계정이름/Samples-OpenCV
처럼...
일단 vi로 ~./bashrc 수정해주고. (폴더 직접들어가서 Visual Studio나 EditPlus 로도 가능.)
export PATH=$PATH:/home/계정명/android-ndk-r7
export ANDROID_NDK_ROOT=/home/계정명/android-ndk-r7
이거 밑부분쯤 추가해주고(여기서 뒤에 android-ndk-r7 은 자신의 ndk 폴더이름이며, 보다싶이 계정뒤에 실제로 위치함)
수정후에
$ source ~/.bashrc 를 쳐주면 적용된다.
home/계정명/(ndk설치폴더)prebuilt/windows/bin/awk.exe 요 파일을 지우던가 이름만 이상한걸루 바꿔주고
cygwin 에서 ndk-build 때려본다.
뭐 could not find directory 하고 variable to point to it 등의 에러정도 뜨면 성공이란다 ㅡㅡ;
두번째 시도때 ndk-build가 없는 명령어라고 뜬다..이것저것 해보긴했는데 결과적으로 알아낸건 없고
bashrc 에서 path를 제대로 등록해줘서 그런지는 모르겠지만 아무튼..다시 된다;;
일단 세팅 완료되었음.
첫번째 단계는 일단 자바로 코드를 작성하는것.
Main 이 되는 클래스
nativeJava myCalc = new nativeJava(); TextView tv = new TextView(this); tv.setText("계산결과 : " + myCalc.libProc(1000, 24)); setContentView(tv); |
Native Code를 부르는 클래스
static { System.loadLibrary("nativeJava"); // 라이브러리를 로드하는 static 함수 } public native int libProc(int a, int b); // native 함수 libProc 선언 |
이제 준비가 되었다. 이제 JNI style로 변환한다.
cygwin 에서 보통
프로젝트 폴더/bin/ 에서 $javah com.계정명.프로젝트명.NativeCode부르는클래스명 식으로 헤더파일을 생성하는데
에러나는 경우가 있다.
보편적으로는 NDK버전에 따라 프로젝트폴더/bin/classes 에서 $javah com.계정명.프로젝트명.NativeCode부르는클래스명
식으로 부르는데 필자는 또다른 에러가 발생하여 (원인은 파악안됨)
다음과 같이 해결 보았다.
프로젝트 폴더에서 $javah -classpath bin/classes com.계정명.프로젝트명.NativeCode를부르는클래스 로 해결보았다.
설명을 돕기 위한 예) $javah -classpath bin/classes com.admin.HelloJNI.NativeCodeCall
★추가(2012.7.23) : h파일을 생성중에 javah 시 can not access Activity 에러로 인하여 분명 class파일을 찾긴했는데 접근을 못한다는 메시지경우 구글링으로 '해결'을 보진 못했지만 '대처'는 찾을 수 있었다. native code를 부르는 Activity에서 다른 class를 밖에다가 선언해주고 그안에다가 native 코드를 부르면 된다. 그러면 위에서 예시로 준 NativeCodeCall 을 대신하여 해당 클래스명으로 바꿔주면 일단 대처는 된다... |
그러면 프로젝트 폴더에 대략 헤더파일이 생긴다. com_admin_HelloJNI_nativeCodeCall.h 는 선언부고
새로운 c파일을 생성해준다. 내용은 거의같으니 일단 복사붙여넣고 뺄건 빼는게 편하다.
다른거 싹 지우고 jni.h include 하는 부분과 함수원형을 남기고
함수의 ; 지우고 파라메터를 모두 각각 넣어주고 { } 를 쳐서 내용을 넣어 정의하도록 한다.
일반적인 C코딩과 같다.
본인은 파라메터 몇개 뺐더니 나중에 NDK-BUILD 에러가 발생해서 애를 많이먹었다.
이제 프로젝트내에서 jni 라는 폴더를 생성해준다. 이안에
Android.mk 라는 파일을 생성해준다. Java에서든 어디서든 뭐 생성하고 에디터(EditPlus나 VisualStudio) 등에서
수정한다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE :=nativeCodeCall LOCAL_SRC_FILES :=nativeCodeCall.c include $(BUILD_SHARED_LIBRARY) |
그리고 기존에 만든 com_admin_HelloJNI_nativeCodeCall.h 와
새로만든 c코드를 위에 mk파일에 정의한대로 바꾸도록한다.
h파일은 nativeCodeCall.h
c파일은 nativeCodeCall.c 하면 되겟다.
이것을 모두 jni폴더에 넣는다.
이제 프로젝트/jni/ 에는
Android.mk 파일과 nativeCodeCall.h 와 nativeCodeCall.c 파일이 존재한다.
★추가(2012.7.23 ) ndk-build 중에 " ~~ 필요로 하는 타겟 nativeCodeCall.c 를 만들 규칙이 없습니다. 멈춤. 이라는 메시지 경우 만들 규칙을 정한 Android.mk 파일을 못찾는다는 말이다. 분명 있는데도 불구하고 안되서 미춰버리는중에 기존에 만들어놨던 프로젝트의 Android.mk 를 덮어씌웠는데... 된다........ 아무래도 본 블로그 소스를 그대로 붙여넣는 과정에서 문제가 생기지 않았는가 조심스레 추측해본다...(혹은 파일 생성이 잘못되거나) |
다음단계이다.
최종 빌드이다.
간단하다.
cgwin에서 프로젝트폴더/jni 에 접근한 뒤에
ndk-build를 때려준다. (아마도..시스템 환경변수에 등록했다면 바로될것이고...)
$ /home/admin/android-ndk-r8/ndk-build -B 를 때려준다.
물론 필자와 독자는 폴더명이 다 다를것이다. 알아서 유추해서 자신에 맞게 치길바란다.
/home/계정명/android-ndk-폴더/ndk-build -B
여기서 -B는 아마 rebuild일것이다. 하는게 더 깔끔할것 같다.
'Android' 카테고리의 다른 글
super(Context), super.onCreate : 예약어 super와 Context (1) | 2012.07.20 |
---|---|
안드로이드 Activity Intent Flag (0) | 2012.07.18 |
Re-installation failed due to different application signatures (0) | 2012.07.13 |
[JNI] Android와의 JavaCV : Mat 구조체 넘김 (0) | 2012.07.10 |
[JNI] JNI 형식 및 데이터 구조 (0) | 2012.07.03 |