자바측 소스 구성
- 라이브러리 로드 : 네이티브 코드로 작성된 라이브러리를 동적으로 로드한다. 당연한 말이지만 네이티브 메쏘드를 호출하기전에 로드해야 한다.
System.loadLibrary("native_library");
객체 생성시 처리해도 되고, static 블럭을 사용해 로드되도록 할 수 있다.
public class TestClass {
static {
System.loadLibrary("native_library");
}
}
- native 메쏘드 선언 : 클래스의 멤버로 메쏘드를 선언한다. 이때, native 키워드를 통해 이 메쏘드는 외부 네이티브 코드에 연결됨을 알린다.
public native void nativeMethodName();
C 측 소스 구성
일단 헤더 파일이 필요한데, 이건 임의로 구성하는게 아닌 java에서 제공하는 툴을 사용해 구성한다.
- 헤더파일 생성
> javah -jin TestClass
이 명령은 위에서 작성한 java TestClass를 기반으로 C에서 사용할 헤더를 생성해 준다.
TestClass.h 파일이 생성되고, native로 선언된 메쏘드의 export 정보가 삽입된다.
JNIEXPORT void JNICALL Java_TestClass_nativeMethodName( JNIEnv*, jobject);
- 메쏘드 구현
위 헤더를 include 하고, 해당 함수를 구현하면 된다.
#include "TestClass.h"
JNIEXPORT void JNICALL Java_Testclass_nativeMethodName( JNIEnv *env, jobject obj )
{
return;
}
- 소스빌드
jin.h 가 존재하는 jdk 의 include 경로를 연결해서 빌드한다.
> gcc -c -I"/Library/java/Home/include -o MyClass.o MyClass.c
- def 생성
dll은 메쏘드를 export 하기 위한 정보를 def 파일에 작성한다.
이파일은 dll을 생성할때 컴파일러가 참조하게 된다. export 할 메쏘드명을 적어주면 된다.
MyClass.def
EXPORT
Java_TestClass_nativeMethodName
- dll 생성
> gcc -shared -o native_library.dll MyClass.o MyClsss.def
윈도우즈 환경에서는 win32 dll 프로젝트로 생성하고, jdk 의 include 디렉토리를
프로젝트에 포함시키면 된다. 혹은 jni.h 를 프로젝트에 포함시키던가~
- 메쏘드 인자 추가
JNIEnv : JNI에서 제공되는 함수들에 접근하기 위한 포인터
jobject : 메쏘드를 호출한 java 오브젝트에 대한 참조
인자 추가 (리턴도 특별할것 없음)
javapublic native void sayHello( int v );
cJNIEXPORT void JNICALL Java_Hello_sayHello( JNIEnv *, jobject, jint );
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 플랫폼 포팅~holloworld 샘플 2 (0) | 2010.02.19 |
---|---|
안드로이드 플랫폼 동적 링크 설정 (0) | 2010.02.19 |
안드로이드 플랫폼 HelloWorld (0) | 2010.02.18 |
Android system 폴더에 쓰기 (0) | 2010.02.08 |
에뮬레이터에서 data,system 디렉토리 가져오기 (0) | 2010.02.04 |
플랫폼 make/ 모듈 추가 방법 (0) | 2010.01.15 |
커널 빌드하기 (0) | 2010.01.14 |
서비스1 - 로컬서비스 (0) | 2009.12.22 |
LayoutInflater를 사용해 레이아웃 구성하기 (0) | 2009.12.15 |
액티비티 변경 에니메이션 (0) | 2009.12.06 |