본문 바로가기

Android

Android With OpenCV using NDK - (1)

 

 

 

주의.

 

본 내용은 예전버전으로 설치내용이 다소 변경될 수 있습니다. 다른블로그 가는것을 권장합니다^^ 

 

 

 


 

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일것이다. 하는게 더 깔끔할것 같다.