|
갑자기 뜬금 없이 JNI라니.. 안드로이드에도 C 기반의 엔진을 지원하다보니 JNI파일을 함께 빌드해야하는 경우가 종종 생긴다. 근데, 처음 접해보면 JNI라는게 참... 불편하다. 특히나, C 기반의 엔진 API가 구조체와 같은 매개변수를 주고 받는다면, 더욱 그렇다. 예를 들어보자. C 기반 라이브러리의 API 파일 clib.h에 다음과 같이 정의되어 있다. // ----------------------------------------------------------------------- // clib.h typedef struct tagTestStruct { int nA; int nB; int nC; } TestStruct; SetParam(TestStruct * pParam); // ----------------------------------------------------------------------- 그리고, 이 라이브러리를 사용하기 위해 wrapper 역할을 하는 API.java파일과 struct를 대체를 testobj.java가 다음과 같이 정의되어 있다. // ----------------------------------------------------------------------- // api.java public class API{ static { System.loadLibrary("clib"); } private API() {} public final static native int SetParam(final int type, Object obj); // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // testobj.java public class TestObj{ public TestObj() {}; public int nA= 0; public int nB = 0; public int nC = 0; } // ----------------------------------------------------------------------- 그리고, javah -jni 명령어를 사용하여 다음과 같이 jni파일을 생성한다. // ----------------------------------------------------------------------- // testobj.java JNIEXPORT jint JNICALL Java_com_SetParam (JNIEnv *env, jclass obj, jint paramtype, jobject param) { } // ----------------------------------------------------------------------- 문제는 세 번째 매개변수인 jobject type으로 전달된 class TestObj의 멤버 변수 값들을 가져오는 방법이다. 먼저, 다음과 같이 jobject타입의 매개변수 param의 class를 구한다. jclass cls; cls = (*env)->GetObjectClass(param); 그리고 class의 각 멤버 변수의 id를 구한다. jfieldID fid;fid = (*env)->GetFieldID(env, cls, "nA", "I"); 이제, class와 field id 정보를 알게 되었기 때문에, field값을 가져오면 된다. jint nA = (*env)->GetIntField(env, param, fid); http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp23720
|
by 황씨 카테고리
최근 등록된 덧글
이거원... Scatter Loa..
by 이터널블루 at 07/20 나도 예전에 노말폰 플랫.. by 황씨 at 10/28 원래 이렇게 하는건데 .. by 황씨 at 10/28 원래 이렇게 하는 것 아.. by 노헝그리 at 10/27 난 가급적이면 매크로를.. by 노헝그리 at 10/27 이건 폰 쪽이라기보단.... by 황씨 at 09/23 니 블로그를 볼 때 마다 .. by 노헝그리 at 09/18 -ㄴ- 그냥 게시판이 필.. by 황씨 at 08/28 레알 유러피언 스타일의.. by 노헝그리 at 08/28 헉.. 여기를 다 방문해.. by 황씨 at 08/28 최근 등록된 트랙백
이전 블로그
이글루 링크
태그
allocation
가상함수
maloc
전역변수
__user_initial_stackheap
오버라이딩
handwriting
API
extern
gcc
make
recognition
scatterloading
RW
polymorphism
archive
robustprogramming
JNI
동적할당
passbypointer
RO
overridding
jobject
다형성
RTM
포인터
virtualfunction
concatenation
macro
unittest
| |||