2012. 7. 6. 00:43

[   ]

 

0. JDK, Android SDK, 이클립스 다운로드 설치

(다른 페이지 참조)

 

1. Android NDK 다운로드 설치

(http://developer.android.com/tools/sdk/ndk/index.html)

 

2. 시그윈(cygwin) 다운로드 설치 

(http://www.cygwin.com/)

devel 전부 체크하고 설치가 맘편하다. (edit vim 포함)

 

 

 

 

3. C/C++ 라이브러리 함수를 호출하는 안드로이드(JAVA) 프로젝트

 

사전 작업 

cygwin 안에 NDK 폴더에서  이클립스에서 New andorid project 만든다.

그리고 한번 실행해준다.

 

$pwd

 /home/k1rha/android-ndk-r8/

$cd smash //내가 만든 프로젝트 

 

 

$ NdkMethod.java // 자바파일 생성

(클래스 명명 규칙에 어긋나는 JNI-function 라는 이름같은 것도 오류를 뱉어 낸다. )

------------------------------------------------------------------------

public class NdkMethod {

     static{

          System.loadLibrary("NdkMethodLibrary");

     }

     public native int NDKTest(int a, int b);

}

-------------------------------------------------------------------------

 

$pwd

$/home/k1rha/android-ndk-r8/PROJECT/smash/bin/classes/

(반드시 classess 에서 명령어를 쳐준다 이유는 헤더를 만들때는 폴더를 들어가는게 아니라 패키지명을 .으로 입력해줘야 하기 때문이다.)

 

$javah edge.smash.NdkMethod //여기서는 폴더가 .으로 패키지를 이어준다.

 

 

 

아래와 같은 파일이 만들어져 있다.

---------------------------edge_smash_NdkMethod.h--------------------------------------

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class edge_smash_NdkMethod */

 

#ifndef _Included_edge_smash_NdkMethod

#define _Included_edge_smash_NdkMethod

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     edge_smash_NdkMethod

 * Method:    NDKTest

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_edge_smash_NdkMethod_NDKTest

  (JNIEnv *, jobject, jint, jint);

 

#ifdef __cplusplus

}

#endif

#endif

 

 

--------------------------------------------------------------------------------

우리는 여기서 JNIEXPORT jint JNICALL Java_edge_smash_NdkMethod_NDKTest
  (JNIEnv *, jobject, jint, jint);
  사용할수 있다.

 

 

4. JNI C/C++ 라이브러리 만들기




 

 

-------------------------------- edge_smash_NdkMethod.c ---------------------------------------

#include "edge_smash_NdkMethod.h"

 

JNIEXPORT jint JNICALL Java_edge_smash_NdkMethod_NDKTest(JNIEnv * pEnv, jobject object, jint a, jint b){

 

             return a+b;

}

---------------------------------------------------------------------------------

4.3 시그윈에서 *.so 빌드하기

 

 

이두개의 파일을 프로젝트 jni 폴더를 만든뒤 집어넣는다.

 

 

$pwd 

/home/k1rha/android-nkd-r8/PROJECT/smash

 

$mkdir jni

$ls

edge_smash_NdkMethod.c edge_smash_NdkMethod.h 

 

여기서 파일 Android.mk 파일을 작성해서 넣어준다

 

------------------------------ Android.mk --------------------------------------------

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE  := NdkMethodLibrary

LOCAL_SRC_FILES := edge_smash_NdkMethod.cpp

include $(BUILD_SHARED_LIBRARY)

 

--------------------------------------------------------------------------------------

 

생성되는 모듈이름

LOCAL_MODULE  := tjssm_ndktest_NdkMethod

소스파일 이름

LOCAL_SRC_FILES := tjssm_ndktest_NdkMethod.cpp

 

 

$ls

edge_smash_NdkMethod.c edge_smash_NdkMethod.h  Android.mk

 

 

$pwd 

/home/k1rha/android-nkd-r8/PROJECT/smash

$ndk-build

 

위와같이 하고나면 libs so 파일이 생긴다

 




 

5. 라이브러리와 안드로이드 프로젝트 합치고 실행하기

 

1.System.loadLibrary("JNItest"); 를 사용하여 so 파일을 로딩한다.

이때 생성된 so 파일에는 제일 앞에 lib가 붙지만 loadLibrary()에 적어줄대는 lib를 빼고 넣어야한다.

그냥 생성된 .h 파일의 이름과 동일하게 넣으면 된다.

 

 

 

 

 

 

 

위의 순서대로 진행하면된다

 

Posted by k1rha