9단계의 절차를 통해 Native C, .so라이브러리를 사용할 수 있게된다.

 

1. Android Project 작성

2. 자바 클래스 작성

3. Header 파일 작성

4. 라이브러리 생성할 소스 디렉토리 생성

5. Android.mk 설정 파일 생성

6. C 소스파일 작성

7. 소스 컴파일/공유 라이브러리 생성

8. Native Method 호출

9. 결과 확인

 


1. Android Project 작성

일반적인 안드로이드 프로젝트를 작성한다.

 

패키지 이름은 적어도 두개 이상으로 나누어져야한다.

Android.AREng 등... 아무렇게나 임의로 작성하면 된다.

그러면 Android 폴더 아래 AREng 폴더 아래 자바 파일이 생성되게 된다.

 


2. 자바 클래스 작성

자바 클래스를 작성한다.

패키지익스플로러 -> 프로젝트이름에서 오른쪽클릭 -> New -> Class

다음 창에서는 패키지를 안드로이드 프로젝트 작성했을 때 작성한 패키지랑 맞춰주고

클래스 이름은 적절하게 지어서 써주시고

수퍼클래스에 java.lang.Object 만 해주세요 그리고 ㅇㅋ

 

NDK에서 C, C++헤더파일을 만들기 위해서 먼저 JAVA를 이용하여 헤더파일을 만들고, 그 후 javah명령을 통해 JNI에 사용되는 헤더파일을 만드는 것,

 

즉, 안드로이드 메인 자바 클래스라고 보면 된다.

LoadLibrary를 해주어야한다

 


3. Header 파일 작성

헤더파일을 작성한다.

메인을 토대로 C에서 사용할 헤더파일이 작성된다.

bin폴더에서 javah를 써주면 된다.

 

javah augmented.AREng.AREng

javah 패키지이름.클래스이름

 


4. 라이브러리 생성할 소스 디렉토리 생성

그냥 안드로이드 프로젝트 바로 하위 폴더에 jni라고 폴더하나만 만들어주면 된다.

폴더가 자동생성되지 않기때문에, 수동으로 만들어줘야한다.

  - src, res등과 같은 위치에 생성하면 된다.

이 위치로 javah로 만들어낸 헤더파일을 옮긴다.

 


5. Android.mk 설정 파일 생성

Android.mk파일은 NDK가 make 파일을 이용해서 네이티브코드를 컴파일하고, 빌드할 때 참조하는 파일이다. 이 파일은 jni폴더 내에 존재해야 한다.

 

Android.mk

LOCAL_PATH := $(call my-dir)  // 컴파일하고자 하는 소스파일의 위치
include $(CLEAR_VARS)   // CLEAR-VARS.mk파일을 Android.mk파일에 포함시킨다
LOCAL_MODULE := QCAR-prebuilt  // Android.mk파일 내 최종 생성되는 모듈을 위해 선언

                                                   // 이렇게 되면 /libs 폴더에 libQCAR-prebuilt.so로 라이브러리 생성
LOCAL_SRC_FILES = ../../../build/lib/$(TARGET_ARCH_ABI)/libQCAR.so   // 모듈을 제작하는데 사용하는 C와 C++의 소스파일을 가리킨다. 화딱지나서 절대경로로 잡았다.
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../build/include // 컴파일시 사용될 헤더파일의 위치. 화딱지나서 절대경로로 잡았다
include $(PREBUILT_SHARED_LIBRARY)  // 생성되는 라이브러리는 공유 라이브러리
include $(CLEAR_VARS)
LOCAL_MODULE := MultiTargets
TARGET_PLATFORM := android-5  // 안드로이드 타겟 플랫폼 5!
OPENGLES_LIB  := -lGLESv2  // OpenGL 라이브러리 ES v2.0
OPENGLES_DEF  := -DUSE_OPENGL_ES_2_0  // 위와 마찬가지
LOCAL_CFLAGS := -Wno-write-strings $(OPENGLES_DEF)
LOCAL_LDLIBS := \
    -llog $(OPENGLES_LIB)  // 로그파일이 기록될 위치
LOCAL_SHARED_LIBRARIES := QCAR-prebuilt 
LOCAL_SRC_FILES := MultiTargets.cpp SampleUtils.cpp Texture.cpp  // 라이브러리가 생성되는 소스파일들의 목록
LOCAL_ARM_MODE := arm  // Android-gcc를 사용하기 위해서 모드설정을 해야해요
include $(BUILD_SHARED_LIBRARY)


 

6. C소스파일 작성

jni폴더 내에 헤더와 같은 이름으로 작성한다.

만약

LOCAL_SRC_FILES := MultiTargets.cpp SampleUtils.cpp Texture.cpp

이렇게 되어있다면, MultiTargets.cpp SampleUtils.cpp Texture.cpp 이렇게 세개의 c소스파일이 있어야 한다.

임의로 내가 필요한 만큼 c파일을 만들고, 그 후 빌드를 하게되면 이게 .so의 라이브러리 파일이 되는 형태

New -> File -> hell.c

 

헤더에서 선언된 내용을 정의해야한다.

이 소스의 형태는 Java Native Method를 사용해야만 한다.

 

7. 소스컴파일/공유라이브러리 생성

그렇타면

src/hello.java  -- hello는 내가 현재 만들고 있는 프로젝트 이름

이걸 가지고서 hello.h라는 헤더파일을 만들어야하고

그리고 libhello.so를 생성하기 위해 build를 해야하는 것이다!

 

우선 Cygwin을 켜자

그리구 내 프로젝트 폴더로 이동하자

cd /cygdrive/c/android/Project/AREng

이동!

bin폴더로 한번만 더 들어가자.

cd bin

javah 명령을 통해 헤더파일을 생성한다.

javah android.AREng (명령어 패키지.클래스이름)

 

그런데 이렇게 해서 나오는 헤더의 이름은 너무너무길어요

패키지_클래스이름.h 의 형태로 나오니까 줄여주자

클래스이름.h

 

그리고 나는 환경변수를 설정했기 때문에 그 자리에서 바로

ndk-build 를 써주면 끗

 

그러면 libhello.so가 만들어진다.

 

 

* 라이브러리 로드하는 부분 static 메서드 잘 확인해야한다.

static {

      System.LoadLibrary("hello");

}

그러니까 "hello"자리에는 라이브러리 이름에서 lib의 접두사만 빼고 넣으면 된다.

 

 

요약

일반 자바 프로젝트를 만들고

자바 클래스 파일을 만든 다음

bin 폴더로가서 javah로 헤더파일을 만들고

jni폴더를 만들어서 javah로 생성된 헤더파일을 넣어주고

만들어진 헤더파일에서 정의된 내용을 c파일로 정의하고

ndk-build를 해주면 .so파일이 생성

이 라이브러리가 맨 처음 자바 클래스에서 작동된다.

 

'Augmented Reality > Moblie AR' 카테고리의 다른 글

Android 개발 시 항상 주의해야 할 점  (0) 2014.06.10
JNI에서 string 사용 방법  (0) 2014.06.10
Android LOG  (0) 2014.06.10
Android App 구조  (0) 2014.06.10
Qualcomm AR SDK - QCAR  (0) 2014.06.10
Posted by 긍정왕오킹