--------------------------------------------------------------------------------------------------
출처 : www.manghon.com/blog
--------------------------------------------------------------------------------------------------
Arrays in JNI
JNI는 기본타입 배열과 객체타입 배열 둘 다 사용할 수 있게 지원한다.
각 기본타입은 대응되는 배열타입을 가진다. 다음은 기본타입과 그것의 배열타입의 리스트이다.
Name of Primitive Data Type (Java) |
Array Type ( For C/C++ Code) |
boolean |
jbooleanArray |
byte |
jbyteArray |
char |
jcharArray |
short |
jshortArray |
int |
jintArray |
long |
jlongArray |
float |
jfloatArray |
double |
jdoubleArray |
그럼 C/C++ 코드에서 어떻게 배열을 사용할까나?
Strings in JNI 와 비슷하게 배열 또한 C/C++ 코드에서 바로 사용할 수는 없다.
JNI 는 배열의 접근, 생성, 정보조회, 동기화를 제공하는 함수들을 제공한다.
jintArray intArray; // 가 있다고 가정할때...
printf("%d\n", intArray[0]); // 이런 방식으론 사용할 수 없다!!
위 코드는 동작하지 않는다. JNI 에서 제공하는 배열 접근 함수를 이용하지 않았기 때문이다.
Array Functions
배열에 대한 함수는 2종류로 나뉘는데 하나는 primitive 타입용이고, 하나는 object 용이다.
다음 배열의 길이를 구하는 함수는 어느 타입이든 사용할 수 있다.
jsize GetArrayLength(jarray array); // 배열의 길이를 구하는 함수
이 함수는 Java Code의 Array 클래스의 length 필드의 값을 리턴한다.
Primitive Array Functions
JNI 는 각각의 기본타입 배열을 위한 함수들을 제공한다. 모든 타입을 다 살펴 보려면 함수가 많기 때문에,
한가지 타입의 버젼만 살펴보겠다.
다음에 표를 보고 Type, ArrayType, NativeType 을 각 아래의 타입명으로 대체한 함수명이 사용된다.
Type |
ArrayType |
NativeType |
boolean |
jbooleanArray |
jboolean |
byte |
jbyteArray |
jbyte |
char |
jcharArray |
jchar |
short |
jshortArray |
jshort |
int |
jintArray |
jint |
long |
jlongArray |
jlong |
float |
jfloatArray |
jfloat |
double |
jdoubleArray |
jdouble |
[ArrayType] New[Type]Array(jsize length);
NewArray 함수는 length 사이즈 만큼 새롭게 생성된 Java 배열을 반환한다.
[NativeType] *Get[Type]ArrayElements([ArrayType] array, jboolean *isCopy);
GetArrayElement 함수는 ArrayType 배열에서 NativeType 의 배열포인터를 반환한다. isCopy 를
JNI_TRUE로 설정하면 복사하여 반환한다. isCopy 가 NULL 이나 JNI_FALSE 가 주어지면 복사하지 않고
원본 배열 포인터를 반환한다.
void Release[Type]ArrayElements([ArrayType] array, [NativeType] *elems, jint mode);
ReleaseArrayElements 함수는 GetArrayElements 함수로부터 반환받은 배열 포인터를 해제한다.
만약 native array 가 복사본이 아니라면, mode 인자를 추가적으로 사용하여 native 배열로부터
Java 배열로 메모리를 복사할 수도 있다. mode 의 가능한 값은 아래와 같다.
mode value 기 능
0 native 배열에서 java 배열로 메모리를 복사하고, native 배열의 메모리를 해제한다.
JNI_COMMIT native 배열에서 java 배열로 메모리를 복사하고, native 배열의 메모리는 해제하지
않는다.
JNI_ABORT native 배열에서 java 배열로 메모리를 복사하지 않고, native 배열의 메모리는
해제한다.
void Get[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);
GetArrayRegion 함수는 Get[Type]ArrayElements 함수와 비슷하게 동작한다. 그러나, GetArrayRegion
함수는 모든 엘리먼트를 반환받지 않고 배열의 부분 집합을 복사할때에 사용한다. start 인덱스에서 len 만큼
을 native 배열 buf로 복사한다.
void Set[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);
SetArrayRegion 함수는 GetArrayRegion 함수의 짝이다. 이 함수는 native 배열의 부분을 Java 배열로
복사하기 위해 사용한다. 엘리먼트의 복사는 native 배열의 index 0에서 부터 시작하고, Java 배열의 start
포지션부터 len 만큼 복사된다.
void *GetPrimitiveArrayCritical(jarray array, jboolean *isCopy);
GetPrimitiveArrayCritical 함수는 배열의 lock 을 가지고 있는 핸들을 반환한다. 만약 확실히 lock 이
필요 하지 않다면 isCopy 인자에 JNI_TRUE 를 주면 된다.(그러면 배열이 복사되므로 작업을 할 수 있다.
락이 필요 없는 작업일 경우...) 아니면 NULL 이나 JNI_FALSE 를 주고 락은 얻어 동기화된 작업을 하면
된다.
void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode);
ReleasePrimitiveArrayCritial 함수는 GetPrimitiveArrayCritical 함수에서 반환받은 핸들을 해제한다.
다음은 사용가능한 mode 리스트이다.
mode value 의 미
0 carray 에서 array 로 값들을 복사하고, carray 와 연관된 메모리를 해제한다.
JNI_COMMIT carray 에서 array 로 값들을 복사하고, carray 와 연관된 메모리는 해제하지
않는다.
JNI_ABORT carray 에서 array 로 값들을 복사하지 않고, carray 와 연관된 메모리를 해제한다.
Object Array Functions
오브젝트 배열을 위한 함수로 3가지를 제공한다. NewObjectArray, GetObjectArrayElement,
SetObjectArrayElement 가 그것이다.
jobjectArray NewObjectArray(jsize length, jclass elementClass, jobject initialElement);
NewObjectArray 함수는 elementClass 로 주어진 오브젝트의 타입과 length 사이즈의 새로운 오브젝트
배열을 생성한다. 이때 배열의 모든 엘리먼트들은 주어진 initialElement 로 초기화 된다.
쉬운 초기화 방법으로 initial 값을 NULL 로 주는 방법이 있다.
jobject GetObjectArrayElement(jobjectArray array, jsize index);
GetObjectArrayElement 함수는 주어진 index 의 객체를 반환하는 함수이다. 만약 index가 배열의 범위를
벗어난다면 IndexOutOfBoundsException을 던진다.
void SetObjectArrayElement(jobjectArray array, jsize index, jobject value);
SetObjectArrayElement 함수는 주어진 index 에 value 객체를 저장한다. 이 함수 역시 index가 배열의
범위를 벗어난다면 IndexOutOfBoundsException을 던진다.
--------------------------------------------------------------------------------------------------
출처 : www.manghon.com/blog
--------------------------------------------------------------------------------------------------
'IT_Programming > Java' 카테고리의 다른 글
ByteBufferPool과 ThreadPool을 추가해 성능 업그레이드하기 (0) | 2009.05.01 |
---|---|
[펌] Jar 파일 사용 - Jar 파일에 포함된 image, 파일 로드하기 (0) | 2009.04.13 |
[펌] Java Native Interface (JNI) - Strings in JNI (0) | 2009.04.13 |
[JDBC] Procedure Call 샘플 코드 (0) | 2009.04.13 |
[JNI] 키보드 후킹 소스 (0) | 2009.04.13 |