[android] NDK를 이용한 jar 만들기

http://millo.tistory.com/3 를 참조해서 연습했고, 까먹기 전에 글을 써본다.

 

.jar 만들기

스크린샷 2014-01-24 오후 3.19.52

스크린샷 2014-01-24 오후 3.20.16

프로젝트를 만들면서 라이브러리에 체크한다.

 

스크린샷 2014-01-24 오후 3.54.03

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

 

스크린샷 2014-01-24 오후 3.55.23

이렇게 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에 넣는다.

스크린샷 2014-01-24 오후 4.10.17

 

그 다음은 보통의 jar 쓰듯이 사용하면 된다.

import kr.mint.ndk.HelloWorld;

HelloWorld hello = new HelloWorld();
Log.i("MainActivity.java | onCreate", "|" + hello.add(30, 90) + "|" + hello.printFromJni());
// ==> |120|Hello World!