2011년 1월 12일 수요일

[ndk] 팁

Directory 별로 구성
여러 so 파일을 생성하기 위해 ${project}/jni 에 각 so 파일 별로 directory 를 만들었다.

각 directory 아래 Android.mk 파일이 존재하며 각 directory 아래 Android.mk 를 실행하기 위해 ${project}/jni/Android.mk 를 다음과 같이 작성했다.

include $(call all-subdir-makefiles)

하나의 Android.mk 에 여러 so 설정
하나의 so 파일은 include $(CLEAR_VARS) ... include $(BUILD_SHARED_LIBRARY) 로 구성된다.

예)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libhello1
LOCAL_SRC_FILES := hello1.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := libhello2
LOCAL_SRC_FILES := hello2.cpp
include $(BUILD_SHARED_LIBRARY)

!) c 와 cpp 파일의 JNIEnv 사용법이 다르다.
예를 들어 GetArrayLength 함수는 jbyteArray 의 length 를 구하는 함수이다.
data 라는 jbyteArray 의 length 를 구하고자 한다면,

c 에는 아래와 같이 사용하고
  (*env)->GetArrayLength(env, data);

cpp 에는 아래와 같이 사용한다.
  env->GetArrayLength(data);

제대로 사용하지 않으면 컴파일시 -> operand 에러가 발생할 수 있다.

!) anroid/log.h 를 사용하려면 Android.mk 파일 작성시 LOCAL_LDLIBS 에 -llog 를 추가한다.

#include <android/log.h>

#define TAG "native"

#define logd(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define logw(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define logv(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define logi(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define loge(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)

댓글 없음:

댓글 쓰기