본문 바로가기
IT 기술/Android

Android Framework 에 Java 라이브러리 및 JNI 추가하기

by 땅뚱 2012. 1. 3.
안드로이드의 Framework 에 내가 짠 코드를 추가하고 싶은 경우에 어떻게 해야 할까? 다양한 방법이 있겠지만(있을까??), 검색해본 결과, 기존 frameworks 의 다른 라이브러리들과 동일하게 추가해주는 것이 가장 간단한 방법인 것으로 생각된다. 작성한 코드는 java 라이브러리 및 java 라이브러리에서 호출하는 JNI 로 구성되어있다고 가정한다.

1. frameworks 에 디렉토리 및 파일 추가
내가 만든 코드를 frameworks 에 추가하여 frameworks.jar 파일에 포함시키고 싶다면, 우선 다음과 같은 위치에 디렉토리를 생성한다.

<ANDROID_TOPDIR>/frameworks/base/<my_directory>

my_directory 아래에 java/<package name directory>/<java files> 와 같은 방식으로 넣는다.
예를 들어 내가 만든 자바 package name 이 com.android.newframe 이라고 하고, 나의 자바 라이브러리 디렉토리 이름을 myframe 이라고 한다면, 다음과 같이 디렉토리구조를 생성하여 만들어 넣는다.

<ANDROID_TOPDIR>/frameworks/base/myframe/java/com/android/newframe/<java files>

2. mk 파일 수정
위와 같이 디렉토리 구조를 만든 후에, 컴파일시에 해당 java 가 frameworks 의 일부로 빌드되어야 함을 알려주어야 한다.

<ANDROID_TOPDIR>/build/core/pathmap.mk 파일을 열어서 FRAMEWORKS_BASE_SUBDIRS 를 찾은 후에 1. 에서 추가한 디렉토리 이름(myframe)을 한줄 추가한다.



이렇게 하면 내가 만든 java code 가 android 의 framework 에 jar 파일로 포함된다. build 후에 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classses.jar 파일을 열어서 확인해보면 컴파일된 나의 java class 가 존재하는 것을 확인할 수 있다.

내가 작성한 JNI 를 안드로이드에 포함시키기 위해서는 다음의 절차를 따른다.

1. frameworks 에 디렉토리에 및 파일 추가
java 라이브러리를 추가할 때 생성한 디렉토리에 jni 라는 디렉토리를 만든다. 해당 디렉토리에 native code 가 구현된 파일을 추가한다.

2. Android.mk 파일 추가
jni 디렉토리에 Android.mk 파일을 추가한다. Android.mk 파일의 내용은 아래의 형식으로 만든다.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := <src file1> <src file2> ...

LOCAL_C_INCLUDES += \
        $(JNI_H_INCLUDE)

LOCAL_MODULE := <target name>

LOCAL_SHARED_LIBRARIES := liblog
#LOCAL_CFLAGS := -DCONFIG_EMBEDDED -DUSE_IND_THREAD

LOCAL_PRELINK_MODULE:=false

include $(BUILD_SHARED_LIBRARY)

jni 추가한 파일이 a.cpp b.cpp 이고 만들 native library 이름이 hellojni 라고 가정하면 Android.mk 파일은 아래와 같이 만들면 된다.


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := a.cpp b.cpp

LOCAL_C_INCLUDES += \
        $(JNI_H_INCLUDE)

LOCAL_MODULE := libhellojni

LOCAL_SHARED_LIBRARIES := liblog
#LOCAL_CFLAGS := -DCONFIG_EMBEDDED -DUSE_IND_THREAD

LOCAL_PRELINK_MODULE:=false

include $(BUILD_SHARED_LIBRARY)

이렇게 한 후에 build 하게 되면 LOCAL_MODULE 에서 정해진 이름으로 so 파일이 생성된다.