실제로 ndk 가 많이 사용되는 경우는 app 과 연동하기 위해서인데,

 

그렇게 하기 위해서는 c / c++ 소스들을 동적 라이브러리, so 파일로 빌드해서,

 

app 패키지에 포함시켜야합니다.

 

이번에는 so 파일로 빌드하기 위한 Makefile 의 예를 올립니다.

 

  1 #
  2 # 
  3 #
  4
  5 #CROSS_PREFIX   = mipsel-linux-
  6 #CROSS_PREFIX   = arm-linux-
  7 #CROSS_PREFIX   = arm-generic-linux-gnueabi-
  8 CROSS_PREFIX   = arm-linux-androideabi-
  9
 10 CP_DIR = /staff/woong
 11
 12 ##
 13 TARGET          = libtest.so
 14 C_SRCS          = lib/tcp.c
 15 CPP_SRCS        = main.cpp jni_help.cpp onload.cpp
 16 #---------------------------------------------------------------------
 17
 18 ##
 19 DIR_INC        =
 20
 21 INCLUDEDIRS     = -I. -I./inc/
 22 LIVDIRS         +=
 23
 24 OBJS            = $(C_SRCS:.c=.o)
 25 OBJS            += $(CPP_SRCS:.cpp=.o)
 26
 27 CFLAGS          = $(INCLUDEDIRS) -nostdlib -fpic -mthumb-interwork -ffunction-sections -fstack-protector \
 28                   -fno-short-enums -Wall -fno-exceptions -DANDROID
 29 CXXFLAGS        =
 30 LDFLAGS         = $(LIVDIRS) -nostdlib -fPIC -Wl,--no-undefined -Wl,-shared,-Bsymbolic,-export-dynamic
 31 LIBS            = -lc -llog -lgcc
 32 #---------------------------------------------------------------------
 33 CC              =   $(CROSS_PREFIX)gcc
 34 CXX             =   $(CROSS_PREFIX)g++
 35 AR              =   $(CROSS_PREFIX)ar rc
 36 AR2             =   $(CROSS_PREFIX)ranlib
 37 RANLIB          =   $(CROSS_PREFIX)ranlib
 38 LD              =   $(CROSS_PREFIX)ld
 39 NM              =   $(CROSS_PREFIX)nm
 40 STRIP           =   $(CROSS_PREFIX)strip
 41 OBJCOPY         =   $(CROSS_PREFIX)objcopy
 42 CP  = cp
 43 MV  = mv
 44 #--------------------------------------------------------------------
 45
 46 all : $(TARGET)
 47     $(CP) $(TARGET) $(CP_DIR)
 48
 49 $(TARGET) : $(OBJS)
 50     $(CC) $(LDFLAGS) -Wl,-soname,$@ $(OBJS) -o $@ $(LIBS)
 51     $(NM) $(TARGET) > $(TARGET).map
 52
 53 %.o:%.c
 54     @echo "Compiling $< ..."
 55     $(CC) -c $(CFLAGS) -o $@ $<
 56
 57 %.o:%.cpp
 58     @echo "C++ compiling $< ..."
 59     $(CXX) -c $(CFLAGS) $(CXXFLAGS) -o $@ $<
 60
 61 dep :
 62     $(CC)   -M  $(INCLUDEDIRS)  $(SRCS) > .depend
 63
 64 clean:
 65     rm -f *.bak
 66     rm -f *.map
 67     rm -f *.o
 68     rm -f $(OBJS)
 69     rm -f $(TARGET) core
 70
 71 show:
 72     @echo "object : $(OBJS)"
 73
 74 distclean: clean
 75     rm -rf .depend 
 76
 77
 78 ifeq (.depend,$(wildcard .depend))
 79 include .depend
 80 endif

 

위와 같은 Makefile 로 만들어진 so 파일을 app 패키지의 libs/armeabi 폴더에 넣고 app 을 빌드하면,

 

jni 를 통해서 java 와 c / c++ 을 연동한 구현이 가능하게 됩니다.

 

물런, 이건 예제이기 때문에 필요에 따라 수정이 필요할 것같습니다.