안드로이드에서 실행되는 native 프로그램 (C 언어) 에서

 

json 을 활용하기 위해 json 라이브러리를 하나 ndk 로 빌드해 보았습니다.

 

혹시 비슷한 작업을 하시는 분이 있다면 도움이 될 수 있도록 과정을 남깁니다.

 

1. 라이브러리 소스 다운

    json C 라이브러리로 많이 사용되는 jansson 소스를 다운 받습니다.

    http://www.digip.org/jansson/

 

2. 소스 추출

    라이브러리 소스 구조가 매우 단순합니다. src 안의 모든 소스를 따로 복사합니다.

 

3. Makefile

    소스를 ndk 컴파일러로 빌드할 수 있도록 Makefile 을 만들어줍니다.

# dynamic library build Makefile

 

CROSS_PREFIX = arm-linux-androideabi-
ANDROID_NDK_ROOT = /opt/toolchain/android-ndk-9
CP_DIR = /staff/sy-nbds

## 사용자 소스
TARGET                  = libjansson.so
#C_SRCS                 = dump.c hashtable.c load.c strbuffer.c utf.c value.c
C_SRCS                  = dump.c error.c hashtable.c load.c memory.c pack_unpack.c strbuffer.c strconv.c utf.c value.c
CPP_SRCS                =
#---------------------------------------------------------------------

## 인클루드 디렉토리
DIR_INC        =

INCLUDEDIRS             = -I. -I$(ANDROID_NDK_ROOT)/sysroot/usr/include/
LIVDIRS                 += -L$(ANDROID_NDK_ROOT)/sysroot/usr/lib/

OBJS                    = $(C_SRCS:.c=.o)
OBJS                    += $(CPP_SRCS:.cpp=.o)

CFLAGS                  = $(INCLUDEDIRS) -nostdlib -Wall -fPIC -O2 -DANDROID
CXXFLAGS                =
LDFLAGS         = $(LIVDIRS) -nostdlib
LDFLAGS         += -Wl,-shared,-Bsymbolic,--no-undefined,-rpath-link=$(ANDROID_NDK_ROOT)/sysroot/usr/lib/
LIBS                = -lc -llog -lgcc -lm
#---------------------------------------------------------------------
CC                              =       $(CROSS_PREFIX)gcc
CXX                             =       $(CROSS_PREFIX)g++
AR                              =       $(CROSS_PREFIX)ar rc
AR2                             =       $(CROSS_PREFIX)ranlib
RANLIB                  =       $(CROSS_PREFIX)ranlib
LD                              =       $(CROSS_PREFIX)ld
NM                              =       $(CROSS_PREFIX)nm
STRIP                   =       $(CROSS_PREFIX)strip
OBJCOPY                 =       $(CROSS_PREFIX)objcopy
CP      = cp
MV      = mv
#--------------------------------------------------------------------

all : $(TARGET)
        $(CP) $(TARGET) $(CP_DIR)

$(TARGET) : $(OBJS)
        $(CC) $(LDFLAGS) -Wl,-soname,$@ $(OBJS) -o $@ $(LIBS)
        $(NM) $(TARGET) > $(TARGET).map

%.o:%.c
        @echo "Compiling $< ..."
        $(CC) -c $(CFLAGS) -o $@ $<

%.o:%.cpp
        @echo "C++ compiling $< ..."
        $(CXX) -c $(CFLAGS) $(CXXFLAGS) -o $@ $<

dep :
        $(CC)   -M      $(INCLUDEDIRS)  $(SRCS) > .depend

clean:
        rm -f *.bak
        rm -f *.map
        rm -f *.o
        rm -f $(OBJS)
        rm -f $(TARGET) core

show:
        @echo "object : $(OBJS)"

distclean: clean
        rm -rf .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif

 

MIT license 라는 라이센스가 있는 것이더군요. 함부로 소스 포함시켰다 소스 공개해야 하는 건 마찬가지입니다.

따라서 별도의 so 로 빌드해야 합니다.

ndk 크로스 컴파일러 사용법은

http://forum.falinux.com/zbxe/index.php?mid=android&document_srl=576443

에서 참조 바랍니다.

 

4. 사용하기.

    application 개발은 #include <jansson.h> 를 추가해서 하면됩니다. 물런 헤더 파일이 찾을 수 있는 위치에 있어야겠지요.

    빌드시에는 당연히 -ljansson 옵션이 링크 옵션으로 들어가야합니다.

    그리고 android device 에서 해당 native application 을 구동하기 위해서는 libjansson.so 가 /system/lib/ 에 들어가 있어야 합니다.

    아니면 so 를 찾지 못해서 재대로 실행할 수 없습니다.