Spec-Zone .ru
спецификации, руководства, описания, API
|
JNI был улучшен в v 1.4 с поддержкой java.nio
пакет так же как новая точка входа в Интерфейсе Вызова JNI. Кроме того, номер версии JNI был постепенно увеличен и описание JNI_OnLoad
обновленный соответственно.
Новая подпрограмма Интерфейса Вызова позволяет собственному коду присоединять поток демона к виртуальной машине Java (JVM); это полезно, когда JVM не должна ожидать этого потока, чтобы выйти на завершение работы.
NIO-связанные точки входа позволяют собственный код доступу java.nio
прямые буферы. Содержание прямого буфера может, потенциально, находиться в собственной памяти за пределами собранной "мусор" "кучи" дежурного блюда. Для получения информации о прямых буферах, пожалуйста, см. Новые API ввода-вывода и спецификацию java.nio.ByteBuffer class.
Каждая реализация виртуальной машины 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.
jint AttachCurrentThreadAsDaemon(JavaVM* vm, void** penv, void* args);
Та же самая семантика как AttachCurrentThread, но недавно создаваемый экземпляр java.lang.Thread является демоном.
Если поток был уже присоединен или через AttachCurrentThread или через AttachCurrentThreadAsDaemon, эта подпрограмма просто устанавливает значение, на которое указывает penv к JNIEnv текущего потока. В этом случае ни AttachCurrentThread, ни эта подпрограмма не имеют эффекта на состояние демона потока.
Индексируйте 7 в JavaVM
таблица функции интерфейса.
vm: экземпляр виртуальной машины, к которому будет присоединен текущий поток.
penv: указатель на расположение, в которое будет помещен указатель на интерфейс JNIEnv для текущего потока.
args: указатель на структуру JavaVMAttachArgs.
Возвраты обнуляют на успехе; иначе, возвращает отрицательное число.
Ни один.
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 возражает сбоям
void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
На выборки и возвраты начальный адрес области памяти ссылается данный прямой java.nio.Buffer.
Эта функция позволяет собственному коду получать доступ к той же самой области памяти, которая доступна для кода Java через буферный объект.
Индексируйте 230 в JNIEnv
таблица функции интерфейса.
env: указатель на интерфейс JNIEnv
buf: прямой объект java.nio.Buffer (не должен быть NULL),
Возвращает начальный адрес области памяти, на которую ссылается буфер. NULL возвратов, если область памяти неопределена, если данным объектом не является прямой java.nio.Buffer, или если доступ JNI к прямым буферам не поддерживается этой виртуальной машиной.
jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf);
На выборки и возвраты емкость в байтах области памяти ссылается данный прямой java.nio.Buffer.
Индексируйте 231 в JNIEnv
таблица функции интерфейса.
env: указатель на интерфейс JNIEnv
buf: прямой объект java.nio.Buffer (не должен быть NULL),
Возвращает емкость в байтах области памяти, связанной с буфером. -1 возвратов, если данным объектом не является прямой java.nio.Buffer, или если доступ JNI к прямым буферам не поддерживается этой виртуальной машиной.