Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Улучшения JNI
Представленный в Версии 1.4
из JavaTM 2 SDK

JNI был улучшен в v 1.4 с поддержкой java.nio пакет так же как новая точка входа в Интерфейсе Вызова JNI. Кроме того, номер версии JNI был постепенно увеличен и описание JNI_OnLoad обновленный соответственно.

Новая подпрограмма Интерфейса Вызова позволяет собственному коду присоединять поток демона к виртуальной машине Java (JVM); это полезно, когда JVM не должна ожидать этого потока, чтобы выйти на завершение работы.

NIO-связанные точки входа позволяют собственный код доступу java.nio прямые буферы. Содержание прямого буфера может, потенциально, находиться в собственной памяти за пределами собранной "мусор" "кучи" дежурного блюда. Для получения информации о прямых буферах, пожалуйста, см. Новые API ввода-вывода и спецификацию java.nio.ByteBuffer class.

Три новых функции позволяют коду JNI создавать, исследовать, и управлять прямыми буферами:

Каждая реализация виртуальной машины 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);

      The VM calls JNI_OnLoad when the native library is loaded (for example,
      through System.loadLibrary).  JNI_OnLoad must return the JNI version
      needed by the native library.

      In order to use the JNI functions introduced in J2SE release 1.2 in
      addition to those that were available in JDK 1.1, a native library must
      export a JNI_OnLoad function that returns JNI_VERSION_1_2.

      In order to use the JNI functions introduced in J2SE release 1.4 in
      addition to those that were available in release 1.2, a native library
      must export a JNI_OnLoad function that returns JNI_VERSION_1_4.

      If the native library does not export a JNI_OnLoad function, the VM
      assumes that the library only requires JNI version JNI_VERSION_1_1.  If
      the VM does not recognize the version number returned by JNI_OnLoad, the
      native library cannot be loaded.

Дополнения к Интерфейсу Вызова JNI

AttachCurrentThreadAsDaemon

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

Та же самая семантика как AttachCurrentThread, но недавно создаваемый экземпляр java.lang.Thread является демоном.

Если поток был уже присоединен или через AttachCurrentThread или через AttachCurrentThreadAsDaemon, эта подпрограмма просто устанавливает значение, на которое указывает penv к JNIEnv текущего потока. В этом случае ни AttachCurrentThread, ни эта подпрограмма не имеют эффекта на состояние демона потока.

РЕДАКТИРОВАНИЕ

Индексируйте 7 в JavaVM таблица функции интерфейса.

ПАРАМЕТРЫ

vm: экземпляр виртуальной машины, к которому будет присоединен текущий поток.

penv: указатель на расположение, в которое будет помещен указатель на интерфейс JNIEnv для текущего потока.

args: указатель на структуру JavaVMAttachArgs.

ВОЗВРАТЫ

Возвраты обнуляют на успехе; иначе, возвращает отрицательное число.

ИСКЛЮЧЕНИЯ

Ни один.


Дополнения к Интерфейсу JNI

NewDirectByteBuffer

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

Выделяет и возвращает прямой java.nio.ByteBuffer, обращающийся к блоку памяти, запускающейся в адресе памяти address и расширяющей байты capacity.

Собственный код, который вызывает эту функцию и возвращает получающийся буферный байтом объект коду на уровне Java, должен гарантировать, что буфер обращается к допустимой области памяти, которая доступна для того, чтобы читать и, если приспособлено, пишущий. Попытка получить доступ к недопустимой ячейке памяти от кода Java будет или возвращать произвольное значение, не иметь никакого видимого эффекта, или заставлять неуказанное исключение быть брошенным.

РЕДАКТИРОВАНИЕ

Индексируйте 229 в JNIEnv таблица функции интерфейса.

ПАРАМЕТРЫ

env: указатель на интерфейс JNIEnv

address: начальный адрес области памяти (не должен быть NULL),

capacity: размер в байтах области памяти (должно быть положительным),

ВОЗВРАТЫ

Возвращает локальную ссылку на недавно инстанцированный объект java.nio.ByteBuffer. NULL возвратов, если исключение происходит, или если доступ JNI к прямым буферам не поддерживается этой виртуальной машиной.

ИСКЛЮЧЕНИЯ

OutOfMemoryError: если выделение ByteBuffer возражает сбоям


GetDirectBufferAddress

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

На выборки и возвраты начальный адрес области памяти ссылается данный прямой java.nio.Buffer.

Эта функция позволяет собственному коду получать доступ к той же самой области памяти, которая доступна для кода Java через буферный объект.

РЕДАКТИРОВАНИЕ

Индексируйте 230 в JNIEnv таблица функции интерфейса.

ПАРАМЕТРЫ

env: указатель на интерфейс JNIEnv

buf: прямой объект java.nio.Buffer (не должен быть NULL),

ВОЗВРАТЫ

Возвращает начальный адрес области памяти, на которую ссылается буфер. NULL возвратов, если область памяти неопределена, если данным объектом не является прямой java.nio.Buffer, или если доступ JNI к прямым буферам не поддерживается этой виртуальной машиной.


GetDirectBufferCapacity

jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf);

На выборки и возвраты емкость в байтах области памяти ссылается данный прямой java.nio.Buffer.

РЕДАКТИРОВАНИЕ

Индексируйте 231 в JNIEnv таблица функции интерфейса.

ПАРАМЕТРЫ

env: указатель на интерфейс JNIEnv

buf: прямой объект java.nio.Buffer (не должен быть NULL),

ВОЗВРАТЫ

Возвращает емкость в байтах области памяти, связанной с буфером. -1 возвратов, если данным объектом не является прямой java.nio.Buffer, или если доступ JNI к прямым буферам не поддерживается этой виртуальной машиной.


Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами