http://millo.tistory.com/3 를 참조해서 연습했고, 까먹기 전에 글을 써본다.
.jar 만들기
프로젝트를 만들면서 라이브러리에 체크한다.
kr.mint.ndk.HelloWorld.java 파일과 jni 폴더를 만들었다.
파일 내용은 아래와 같다.
package kr.mint.ndk; public class HelloWorld { static { System.loadLibrary("hellojni_lib"); } public native String printFromJni(); public native int add(int a, int b); }
다음은 <projecct>/jni/hellojni_lib.c 파일을 만든다.
#include "kr_mint_ndk_HelloWorld.h" JNIEXPORT jstring JNICALL Java_kr_mint_ndk_HelloWorld_printFromJni(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello World!"); } JNIEXPORT jint JNICALL Java_kr_mint_ndk_HelloWorld_add(JNIEnv *env, jobject obj, jint a, jint b) { return a + b; }
다음은 <project>/jni/Android.mk 파일을 만든다.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hellojni_lib LOCAL_SRC_FILES := hellojni_lib.c include $(BUILD_SHARED_LIBRARY)
소스를 입력하는 부분은 다 끝났다.
.h와 .so를 만들기 위해 터미널에서 <project>/bin/classes 로 이동한다.
$ pwd /NDKHelloWorldLibrary/bin/classes $ javah -jni kr.mint.ndk.HelloWorld
이렇게 classes 폴더에 kr_mint_ndk_HelloWorld.h 파일이 생성된다.
이 파일을 <project>/jni 폴더에 넣는다.
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class kr_mint_ndk_HelloWorld */ #ifndef _Included_kr_mint_ndk_HelloWorld #define _Included_kr_mint_ndk_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: kr_mint_ndk_HelloWorld * Method: printFromJni * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_kr_mint_ndk_HelloWorld_printFromJni (JNIEnv *, jobject); /* * Class: kr_mint_ndk_HelloWorld * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_kr_mint_ndk_HelloWorld_add (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif
직접 쳐도 될 것 같은 느낌이긴 하지만, 자동으로 만들수 있으므로 직접 치지는 말자.
.so 파일을 만들자.
$ ndk-build [armeabi] Compile thumb : hellojni_lib <= hellojni_lib.c [armeabi] SharedLibrary : libhellojni_lib.so [armeabi] Install : libhellojni_lib.so => libs/armeabi/libhellojni_lib.so
ndk 소스 설치 (ndk-build 는 NDK 를 받아야한다.)
이렇게하면 <project>/libs/armeabi/lebhellojni_lib.so 파일이 만들어진다.
프로젝트를 컴파일하면 <project>/bin/ndkhelloworldlibrary.jar 파일이 만들어진다.
.jar 사용하기
또 다른 프로젝트를 만들고, 위의 프로젝트에서 만든 ndkhelloworldlibrary.jar와 armeabi 폴더를 새로 만든 프로젝트의 libs에 넣는다.
그 다음은 보통의 jar 쓰듯이 사용하면 된다.
import kr.mint.ndk.HelloWorld; HelloWorld hello = new HelloWorld(); Log.i("MainActivity.java | onCreate", "|" + hello.add(30, 90) + "|" + hello.printFromJni()); // ==> |120|Hello World!