> For the complete documentation index, see [llms.txt](https://sungcheol-kim.gitbook.io/jni-tutorial/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sungcheol-kim.gitbook.io/jni-tutorial/chapter15.md).

# 배열 다루기 1/4

자바 배열을 표현하는 JNI 배열 데이터형은 jarray이고 배열이 담는 데이터형에 따라 jarray를 상속받은 여러 배열 데이터형이 존재한다.

* jarray
  * jbooleanArray
  * jbyteArray
  * jcharArray
  * jshortArray
  * jintArray
  * jlongArray
  * jfloatArray
  * jdoubleArray
  * jobjectArray

자바 배열을 전달 받아서 길이를 반환하는 예제를 작성해 보자.

```
$ vi GetArrayLength.cpp
```

```cpp
#include <jni.h>

jint getArrayLength
(
    JNIEnv          *env,
    jobject         thiz,
    jarray          elements
)
{
    return env->GetArrayLength(elements);
}

jint getIntArrayLength
(
    JNIEnv          *env,
    jobject         thiz,
    jintArray       elements
)
{
    return env->GetArrayLength(elements);
}


JNIEXPORT jint JNICALL JNI_OnLoad
(
    JavaVM      *vm,
    void        *reserved
)
{
    JNIEnv      *env;
    if(vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)) {
        return -1;
    }

    JNINativeMethod nm[2] ={

        {
            const_cast<char*>("getArrayLength"),
            const_cast<char*>("([Ljava/lang/Object;)I"),
            reinterpret_cast<void*>(getArrayLength)
        }
        ,
        {
            const_cast<char*>("getIntArrayLength"),
            const_cast<char*>("([I)I"),
            reinterpret_cast<void*>(getIntArrayLength)
        }

    };

    jclass cls = env->FindClass("Client");
    env->RegisterNatives(cls, nm, 2);
    return JNI_VERSION_1_6;
}
```

위의 예제에서 jarray를 java.lang.Object 의 배열로 매핑했는데 사실 jobjectArray로 매핑하는 것이 더 정확하다. 일부러 jarray를 쓴 이유는 jarray 를 시그니쳐로 표현할 수 없기 때문에 하나의 함수로 모든 종류의 배열 길이를 얻을 수 없음을 보여주기 위함이다. 컴파일해서 라이브러리로 만든다.

```
$ g++ "-I/System/Library/Java/JavaVirtualMachines/Current/" -std=c++11 -c GetArrayLength.cpp
$ g++ -dynamiclib -o libgetarraylength.jnilib getarraylength.o
```

자바 코드에서 라이브러리를 사용해 보자.

```
$ vi Client.java
```

```java
public class Client {

    private native int getArrayLength(Object[] array);
    private native int getIntArrayLength(int[] array);

    public static void main(String[] args) {

        Client client = new Client();

        System.out.println("The length of array " + client.getArrayLength(new Integer[]{1, 2, 3, 4, 5}));

        //캐스팅 오류가 발생한다.
        //System.out.println("The length of array " + client.getArrayLength(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}));

        System.out.println("The length of array " + client.getIntArrayLength(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}));
    }

    static {
        System.loadLibrary("getarraylength");
    }
}
```

컴파일하고 실행해 본다.

```
$ javac Client.java
$ java Client
The length of array 5
The length of array 9
```
