Android/SQLite 공유 라이브러리를 이용하는 C로 프로그램 작성

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);
  1. dlopen 프로그램에서 목적 파일에 접근이 가능하도록 만든다.
  2. dlsym dlopen으로 연 목적 파일 내부에서 심볼 주소를 얻는다.
  3. dlerror 발생한 마지막 오류 내역을 문자열로 반환한다.
  4. 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 형태의 파일을 빌드하게 된다.

참고

개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
도구모음
인쇄/내보내기