Android/SQLite 공유 라이브러리를 이용하는 C로 프로그램 작성
Retired DISLab
목차 |
개요
- 안드로이드에 내장되어 있는 SQLite를 사용하기 위해서는 SQLite 공유 라이브러리를 사용해야 한다.
- JNI를 이용하여 작성한 Native Code를 수행할 때 SQLite 공유 라이브러리를 참조하기 위해 동적링킹을 해야한다.
Dynamic Loading API
동적 적재를 지원하는 라이브러리이다. 공유 라이브러리를 사용자 영역 프로그램에서 사용할 수 있게 한다.
#include <dlfcn.h> void *dlopen(const char *file, int mode); void *dlsym(void *handle, char *symbol); const char *dlerror(); int dlclose(void *handle);
- dlopen 프로그램에서 목적 파일에 접근이 가능하도록 만든다.
- dlsym dlopen으로 연 목적 파일 내부에서 심볼 주소를 얻는다.
- dlerror 발생한 마지막 오류 내역을 문자열로 반환한다.
- dlclose 목적 파일을 닫는다.
- 안드로이드에 내장된 libsqlite.so의 심볼보기
- 이클립스의 DDMS를 사용하면 system/lib/ 디렉토리에 libsqlite.so 라이브러리를 확인할 수 있다. 이 라이브러리를 PC로 가져올 수 있다.
Cygwin을 이용하여 libsqlite.so의 심볼을 확인할 수 있다. 명령어 : nm -D libsqlite.so
SQLite 공유 라이브러리를 사용한 C 프로그램의 예
- SqliteTest.c
SQLITE_API int (*om_sqlite3_open)( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );
- SqliteTest.c
g_hSQLite = dlopen("/system/lib/libsqlite.so", RTLD_LAZY); if (!g_hSQLite) { return EOM_SQLITE_LIB_LOAD; } om_sqlite3_open = dlsym(g_hSQLite, "sqlite3_open"); if ( om_sqlite3_open == 0 ) return EOM_SQLITE_SYMLOAD_OPEN;
- dlsym은 dlopen을 통해서 open한 라이브러리를 사용할 수 있도록 심볼값을 찾아준다. open한 라이브러리에서 실제로 호출할 함수의 이름
Android.mk 파일 분석
- 안드로이드 NDK에서
dlopen()
,dlsym()
,dlclose()
같은 함수를 사용하게 되면,libdl.so
파일을 링크해야 한다.- 일반적인 방식으로
LOCAL_LDLIBS += -ldl
이런식으로 기술한다.
- 일반적인 방식으로
- 특정 라이브러리를 사용하기 위해
LOCAL_LDLIBS
변수에 내용을 기술한다.
- Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 링커 관련 플래그 LOCAL_LDLIBS += -ldl # 출력 모듈명과 소스목록 LOCAL_MODULE := SqliteTest LOCAL_SRC_FILES := SqliteTest.c # 안드로이드 에뮬레이터인 경우 libdl 을 동적 참조한다. LOCAL_SHARED_LIBRARY := libdl #빌드방식 include $(BUILD_SHARED_LIBRARY)
- 마지막 줄의 include
$(BUILD_SHARED_LIBRARY)
은 shared library, 즉 .so 파일로 빌드 하겠다는 뜻이다. 이렇게 기술하면 자동으로 lib+모듈명+.so 형태의 파일을 빌드하게 된다.