IT_Programming/Java

[펌] Arrays in JNI

JJun ™ 2009. 4. 13. 00:40

 

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

출처 : 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

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