JNI 사용시 Android.mk와 Application.mk에 대해서

인터넷 돌아다니다가 안드로이드용 Power Spectrum 소스를 구했음.
start 버튼 누르고 마이크에 대고 말하면 주파수 대역을 그려주는 소스인데
앱 소스 출처: http://som-itsolutions.blogspot.kr/2012/01/fft-based-simple-spectrum-analyzer.html

이걸 NDK를 써서 JNI로 옮겨보기로 했음. (기본 소스가 내 핸폰에서 느리기도 해서)

static{
System.loadLibrary("createFFTWrapper");
System.loadLibrary("ndkFT");
 }
private native long createFFTWrapper(int blockSize); // Void constructor
private native void ndkFT(long nativePointer, double[] c, int size);

두번째 줄에서 자꾸 에러가 나는거임 어제 하던거라 에러메세지는 기억 안남.
이런저런거 찾아보다가 OpenCV JNI 하던게 생각나서Android.mk랑  Application.mk를 찾아봄.
그리고 인터넷 검색해서 현 프로젝트에 맞춰서 수정해보고 잘 되는거 확인후 여기에 정리해둠.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := kr_co_linsoo_fftvoice_fftWrapper.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := ndkvoice

include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)

현재 작업중인 FFTVoice의 Android.mk 파일 내용.

1. LOCAL_PATH := $(call my-dir)
– android.mk 파일이 위치하고 있는 현 경로를 기본 패스로 지정함.
(그래서 jni폴더에 이 파일을 만들고 cpp파일도 같이 넣어두는거죠.)

2. include $(CLEAR_VARS)
– LOCAL_SRC_FILES, LOCAL_LDLIBS, LOCAL_MODULE 등등 LOCAL_XXXX 로 시작되는 변수들을 초기화 합니다.

3. LOCAL_SRC_FILES
– 컴파일할 소스파일을 적어줍니다. 파일 하나 하나 적어줘도 되고 파일리스트를 만들어서
해당경로 디렉토리에 있는 파일을 자동으로 입력할수도 있습니다.

LOCAL_SRC_FILES := kr_co_linsoo_fftvoice_fftWrapper.cpp 부분을 아래와 같이 바꿔도 됩니다.

FILE_LIST:= $(wildcard &(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

JNI 폴더에 있는 모든 cpp파일을 빌드함.

4. LOCAL_LDLIBS
– 추가 라이브러리 링크 걸때 사용.
예를 들어 Liblinsoo.so 파일이면 -llinsoo 라고 쓰면 됨
https://developer.android.com/ndk/guides/stable_apis.html <== 여기에 가면 각종 옵션 설명이 나옴.

5. LOCAL_MODULE
– 빌드해서 만들 모듈이름을 지정하는곳

6. include $(BUILD_SHARED_LIBRARY)
– 생성되는 라이브러리를 스태틱으로 할건지 공유형으로 할건지 정하는것

이 글 작성하다가 깨달았는데 굳이 Android.mk 하나로 모든걸 퉁칠 필요 없이
CPP 하나나 몇개 모아서 하나의 lib로 만들때 마다 mk파일 하나씩 만들어 넣으면 된다는걸 깨달음.
테스트로 내가 작성한 lib 생성용 mk파일 하나 만들고 android.mk파일 안에다가

include fftWrapper.mk

이거 한줄 넣어주니 실행 잘 됨.

아직 이해 안되는것이 좀 있긴 한데 지금 당장은 모르겠고 이것저것 해보다 보면 깨닫게 되는 날이 오겠지.

참고 사이트 : https://developer.android.com/ndk/guides/android_mk.html


크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.