Java 2 SDK 에서의 JNI 의 확장 기능 - xrath.com 에서 번역됨

# 버젼 1.4 의 JavaTM 2 SDK
그리고 도입된 JNI 의 확장 기능

JNI 문서

JNI 버젼 1.4 에서는, JNI 호출 인터페이스의 새로운 엔트리 포인트외,`java.nio` 패키지의 지원가 추가되었습니다. 또, JNI 버젼 번호가 올랐던 것에 따라 `JNI_OnLoad` 의 해설이 갱신되었습니다.

새로운 호출 인터페이스 루틴에 의해, native code가 Java 가상 머신 (JVM)에 「demon」thread를 접속할 수 있습니다. 이것은, 이 thread가 종료시에 종료하는 것을 JVM 가 기다려야 하는 것이 아닌 경우에 편리합니다.

- `AttachCurrentThreadAsDaemon`

NIO 관련의 엔트리 포인트에 의해, native code가 `java.nio`「직접 버퍼」에 액세스 할 수 있습니다. 직접 버퍼의 컨텐츠는, 일반적으로의 가베지 컬렉트된 heap의 외측의, 네이티브메모리내에 포함할 수가 있습니다. 직접 버퍼에 대한 자세한 것은, 「New I/O API 」 및 `java.nio.ByteBuffer` 클래스의 스펙을 참조해 주세요.

3 개(살)의 새로운 함수에 의해, 직접 버퍼를 JNI 코드로 작성, 검사, 및 조작할 수가 있습니다.

- `NewDirectByteBuffer`
- `GetDirectBufferAddress`
- `GetDirectBufferCapacity`

Java 가상 머신의 각 구현에서는 이러한 함수를 지원할 필요가 있습니다만, 모든 구현이 직접 버퍼에의 JNI 의 액세스를 지원할 필요는 없습니다. JVM 가 이러한 액세스를 지원하지 않는 경우는,`NewDirectByteBuffer` 및 `GetDirectBufferAddress` 함수는 항상 `null` 를 돌려주어,`GetDirectBufferCapacity` 함수는 항상 `-1` 을 돌려줍니다. JVM 가 이러한 액세스를 지원하는 경우, 각 함수는 적절한 값을 돌려주도록(듯이) 구현될 필요가 있습니다.

## 버젼 번호의 상승

JNI 의 버젼 번호가 올랐습니다. 인클루드 파일 `jni.h` 에서는, 새로운 정수를 정의하고 있습니다.

        #define JNI_VERSION_1_4 0x00010004

`GetVersion` 프로시저는 현재 이 값을 돌려주어,`JNI_OnLoad` 프로시저의 스펙이 개정되고 있습니다.

        jint JNI_OnLoad(JavaVM *vm, void *reserved);

          네이티브 라이브러리가 로드 되면(자) (예를 들어 System.loadLibrary 를 개입시켜),
          VM 는 JNI_OnLoad 를 호출합니다. JNI_OnLoad 는,
          네이티브 라이브러리가 필요로 하는 JNI 를 돌려주지 않으면 안됩니다.

          JDK 1.1 으로 이용할 수 있는 함수에 가세해 J2SE 1.2로 도입되었다
          JNI 함수를 사용하려면 , 네이티브 라이브러리는
          JNI_VERSION_1_2 를 돌려주는 JNI_OnLoad 함수를 export 할 필요가 있습니다.

          J2SE 릴리스 1.2 로 이용할 수 있는 함수에 가세해 J2SE 릴리스 1.4로 도입되었다
          JNI 함수를 사용하려면 , 네이티브 라이브러리는
          JNI_VERSION_1_4 를 돌려주는 JNI_OnLoad 함수를 export 할 필요가 있습니다.

          네이티브 라이브러리가 JNI_OnLoad 함수를 export 하지 않으면 VM 는
          라이브러리가 JNI 버젼 JNI_VERSION_1_1 만을 필요로 하고 있다고 봅니다.
          VM 가 JNI_OnLoad 로 반환되는 버젼 번호를 인식하지 않으면
          네이티브 라이브러리를 로드할 수 없습니다.

## JNI 호출 인터페이스에의 추가

  ### AttachCurrentThreadAsDaemon

    `jint AttachCurrentThreadAsDaemon(JavaVM* vm, void** penv, void* args);`

    `AttachCurrentThread` 와 시멘틱스는 같습니다만, 새롭게 작성 `java.lang.Thread` 인스턴스는 「demon」입니다.

    thread가 벌써 `AttachCurrentThread` 또는 `AttachCurrentThreadAsDaemon` 를 개입시켜 접속되고 있는 경우, 이 루틴은 `penv` 로 포인트 되고 있는 값을 현재의 thread의 `JNIEnv` 로 설정합니다. 이 경우,`AttachCurrentThread` 도 이 루틴도, thread의 「demon」에게 영향을 주지 않습니다.

  #### 링키지

    `JavaVM` 인터페이스 함수 테이블의 인덱스 7

  #### 파라미터

    `vm`:현재의 thread가 접속되는 가상 머신 인스턴스

    `penv`:현재의 thread의 `JNIEnv` 인터페이스 포인터가 배치되는 위치에의 포인터

    `args`:`JavaVMAttachArgs` 구조체에의 포인터

  #### 반환값

    성공했을 경우는 0, 실패했을 경우는 부의 수를 돌려줍니다.

  #### 예외

    없음

## JNI 인터페이스에의 추가

  ### NewDirectByteBuffer

    `jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);`

    메모리아드레스 `address` 로부터 시작되는 `capacity` 바이트까지의 메모리브록크를 참조해, 직접 버퍼 `java.nio.ByteBuffer` 를 할당해 돌려줍니다.

    이 함수를 호출해, Java 레벨의 코드에 최종적인 바이트 버퍼의 객체를 돌려주는 native code는, 그 버퍼가, read와 적절한 경우에는 서두의 액세스가 가능한, 유효한 메모리 영역을 참조할 필요가 있습니다. Java 코드로부터 무효인 메모리 위치에 액세스 하려고 하면(자), 시각 효과가 없는 임의의 값을 돌려주는지, 지정되어 있지 않은 예외가 발생합니다.

  #### 링키지

    `JNIEnv` 인터페이스 함수 테이블의 인덱스 229

  #### 파라미터

    `env`:`JNIEnv` 의 인터페이스 포인터

    `address`:메모리 영역의 개시 주소 (`null` 는 불가)

    `capacity`:메모리 영역의 바이트수로 가리킨 사이스 (정의 수인 것)

  #### 반환값

    신규에 인스턴스화 된 `java.nio.ByteBuffer` 객체의 로컬 참조를 돌려줍니다. 예외가 발생하거나 이 가상 머신이, 직접 버퍼에의 JNI 의 액세스를 지원하고 있지 않는 경우는,`null` 를 돌려줍니다.

  #### 예외

    `OutOfMemoryError`:`ByteBuffer` 객체의 할당해에 실패했을 경우

  ### GetDirectBufferAddress

    `void* GetDirectBufferAddress(JNIEnv* env, jobject buf);`

  지정된 직접 버퍼 `java.nio.Buffer` 에 참조되는 메모리 영역의 개시 주소를 페치 해, 돌려줍니다.

  이 함수에 의해, native code는, Java 코드가 버퍼 객체를 개입시켜 액세스 할 수 있는 메모리 영역과 같은 메모리 영역에 액세스 할 수 있게 됩니다.

#### 링키지

  `JNIEnv` 인터페이스 함수 테이블의 인덱스 230

#### 파라미터

  `env`:`JNIEnv` 의 인터페이스 포인터

  `buf`:직접 버퍼 `java.nio.Buffer` 객체 (`null` 는 불가)

#### 반환값

  버퍼에 참조되는 메모리 영역의 개시 주소를 돌려줍니다. 메모리 영역이 미정도리의 경우, 지정된 객체가 직접 버퍼의 `java.nio.Buffer` 객체가 아닌 경우, 또는, 직접 버퍼에의 JNI 의 액세스가 이 가상 머신으로 지원되어 있지 않은 경우는,`null` 를 돌려줍니다.

### GetDirectBufferCapacity

  `jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf);`

  지정된 직접 버퍼 `java.nio.Buffer` 에 참조되는 메모리 영역의 바이트수로 가리킨 사이즈를 페치 해, 돌려줍니다.

#### 링키지

  `JNIEnv` 인터페이스 함수 테이블의 인덱스 231

#### 파라미터

  `env`:`JNIEnv` 의 인터페이스 포인터

  `buf`:직접 버퍼 `java.nio.Buffer` 객체 (`null` 는 불가)

#### 반환값

  버퍼에 관련지을 수 있었던 메모리 영역의 사이즈를 바이트수로 돌려줍니다. 지정된 객체가 직접 버퍼의 `java.nio.Buffer` 객체가 아닌 경우, 또는, 직접 버퍼에의 JNI 의 액세스가 이 가상 머신으로 지원되어 있지 않은 경우는,`-1` 을 돌려줍니다.

Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved. 코멘트의 송부처:jni@java.sun.com |