여러 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__)
댓글 없음:
댓글 쓰기