인터넷 돌아다니다가 안드로이드용 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
답글 남기기