티스토리 뷰

 NDK 작업을 하면서 C로 작성을 하는데 printf 등을 통해 로그를 찍을 수는 없습니다. Android DDMS 툴에서는 로그가 보이지 않으니깐요. 파일로 출력할 수도 있지만 그것도 매번 파일을 꺼내서 열어보는 불편함이 있습니다. 다양한 방법으로 단순한 로그를 출력해볼 수 있겠지만 이번에 소개해드릴 NDK에서의 로그를 찍는 방법은 안드로이드에서 제공하는 방법을 사용하게 됩니다.

 #define를 통해 사용하기 편리하게 적용해두고 사용하는게 편리하게 사용할 수 있습니다. 이런 부분은 ndk 예제를 열어보면 확인할 수 있습니다. 주로 사용하는 로그들을 간단히 출력된 화면을 확인해보겠습니다.


NDK에서 Log 찍기

 NDK에서 로그를 찍는 방법은 2개의 include와 1개의 로그 찍는 라인의 추가를 해줘야 합니다.

 1. Android.mk 에 lib 추가

 2. 로그를 찍어야하는 c 파일에 head 추가

 3. 로그를 찍어하는 부분의 메소드 작성


 위와 같이 3개의 작업을 진행하면 안드로이드에서 로그 찍기를 할 수 있습니다.

 1. Android.mk에 추가

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := ndk-test
LOCAL_SRC_FILES := ndk-test.c

#log에 대한 lib를 추가합니다.
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

 2. head 추가

각 c/cpp 파일에 추가하면 됩니다.

#include <android/log.h>

 3. 로그 정의

__android_log_print("로그 타입", "로그 명", "로그 내용 및 변수 타입", 변수);

#define를 통한 로그 찍기 정의 (Log.h 파일로 생성)

  로그 정의하는 부분이 상당히 길게 느껴집니다. __android_log_print() 로 시작하는데 앞에 __ 두개가 빠지면 에러가 나게 됩니다. 좀더 편리하게 사용하기 위해서 아래와 같이 #define를 통해 미리 정의를 해두고 이후에는 LOGD(로그 내용 및 변수 타입, 변수); 등으로 작성을 하여 사용할 수있도록 미리 head파일을 정의하여 사용하고있습니다. 현재는 LOG_TAG에 대한 정의는 따로 할수 없고 아래와 같이 정의를 해두었습니다. LOG_TAG에 대한 정의를 다시하고 싶으시다면 #define LOGD(LOG_TAG, ...) 으로 다시 정의하시면 이후 LOGD("로그명", "로그내용 및 변수 타입", 변수) 등으로 사용할 수 있습니다.

#include <android/log.h>

#define  LOG_TAG    "NDK_TEST"
#define  LOGUNK(...)  __android_log_print(ANDROID_LOG_UNKNOWN,LOG_TAG,__VA_ARGS__)
#define  LOGDEF(...)  __android_log_print(ANDROID_LOG_DEFAULT,LOG_TAG,__VA_ARGS__)
#define  LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define  LOGF(...)  __android_log_print(ANDROID_FATAL_ERROR,LOG_TAG,__VA_ARGS__)
#define  LOGS(...)  __android_log_print(ANDROID_SILENT_ERROR,LOG_TAG,__VA_ARGS__)

마무리

결과 화면은 아래와 같이 출력됩니다. 에러 로그에 대해서 심각하 무시 에러, 그냥 에러 등으로 표시 됩니다. 저는 보통 Debug, Info, Error, Verbose 정도를 주로 사용하는 것 같습니다.

GCC가 가능하다면 NDK로 바로 컴파일 하기 보다는 C/C++로 컴파일하고 NDK에 붙여보는것도 나쁘진 않은 것 같습니다. 개발하는 과정에서 빠른것 보다는 자기한테 최적화된게 가장 좋아보입니다.^^;




댓글