
Utilización de código C o C++ nativo de 31 bits con la máquina virtual Java de 64 bits (soloz/OS )
A partir de la renovación de servicio 6, fixpack 35, puede volver a compilar el código C o C++ nativo de 31 bits y utilizarlo con una aplicación Java™ que se ejecute en una máquina virtual Java (VM) de 64 bits. Esta característica facilita la migración de aplicaciones Java que utilizan código nativo desde el SDK de 31 bits al SDK de 64 bits, con cambios mínimos en el código nativo.
Antes de empezar
Esta característica requiere el APAR PH28966 en z/OS® 2.3 o posterior.
null. Para crear un almacenamiento intermedio directo y asegurarse de que la memoria de almacenamiento intermedio nativa está en el rango de 31 bits, es posible que tenga que modificar el código C o C++ de la forma siguiente:- Asigne la memoria de 31 bits utilizando la función adecuada. Si el código C o C++ se ejecutará en AMODE 31, utilice la función malloc() para asignar la memoria. Si el código C o C++ se ejecutará en AMODE 64, utilice la función __malloc31() para solicitar memoria en el rango de 31 bits.
- Cree el almacenamiento intermedio de bytes directos de Java que hace referencia a esta memoria de 31 bits pasando el almacenamiento intermedio en el parámetro de dirección de la función NewDirectByteBuffer() :
Para obtener más información sobre esta función, consulte la documentación deOracle JNI.jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity); - Realice un seguimiento del objeto ByteBuffer resultante. Cuando el objeto ya no sea utilizado por ningún método Java, libere la memoria de almacenamiento intermedio nativa. Este paso es necesario porque la JVM no libera la memoria de almacenamiento intermedio nativa cuando procesa el objeto ByteBuffer durante la recogida de basura.
Acerca de esta tarea
Es posible que desee migrar sus aplicaciones Java a la versión de 64 bits de IBM® SDK, Java Technology Edition para aprovechar el aumento de la capacidad de almacenamiento virtual (limitada a 2GB en el SDK de 31 bits). Por lo general, las aplicaciones Java que ejecutan código nativo de 31 bits solo pueden ejecutarse con un SDK de 31 bits; mezclar código de 31 bits y código de 64 bits en el mismo espacio de proceso es complicado debido a la incompatibilidad de los tamaños de los punteros y la direccionabilidad de la memoria entre estos dos tipos de código.
Con el APAR PH28966 en z/OS 2.3 y posterior, z/OS Language Environment® (LE) proporciona la posibilidad de ejecutar programas AMODE 31 y programas AMODE 64 en el mismo espacio de direcciones. Se establecen entornos LE separados para cada modalidad de direccionamiento (AMODE). El SDK de IBM aprovecha esta función para simplificar la migración de aplicaciones Java que utilizan código nativo de 31 bits al SDK de 64 bits. Las API de invocación y JNI del SDK de 64 bits permiten al código nativo de 31 bits compilar, enlazar e interoperar con el SDK de 64 bits. La máquina virtual de 64 bits también da soporte a la carga e invocación de bibliotecas y funciones nativas de 31 bits.
- Conjunto compatible de 31 bits de archivos de cabecera JNI de C/C++, que contienen datos JNI y tipos de argumentos para dar soporte a las API de invocación y JNI. Estos archivos se encuentran en el directorio javahome/include31 , donde javahome es la vía de acceso JAVA_HOME de la instalación de IBM SDK. Los tipos JNI que representan referencias de objeto y otras construcciones de VM, como
jobject,jarray,jclass,jmethodIDyjfieldID, se actualizan para que sean representaciones de 64 bits.Nota: Puesto que el lenguaje C no proporciona una forma de definir un tipopointerde 64 bits en una aplicación de 31 bits, en su lugar se utiliza un tipo de datoslong longprimitivo de 64 bits. Esto puede dar lugar a avisos de compilador para el código que asigna o compara referencias de objeto JNI conNULL. Es posible que tenga que actualizar el código para asignar o comparar con0en su lugar. - Una biblioteca compartida de 31 bits, libjvm31.so, con un archivo de cubierta lateral libjvm31.x coincidente para habilitar el código nativo de 31 bits para enlazar y resolver las API de invocación y JNI.
- Vuelva a compilar cualquier código nativo C o C++ que haga referencia a las construcciones JNI en el conjunto include/jni31 de archivos de cabecera JNI y enlace con la biblioteca libjvm31.so.
- Ejecute la aplicación Java con el SDK de 64 bits, especificando la opción
-XX:+Enable3164InteroperabilityVM.
- La aplicación nativa de 31 bits debe ser una sola hebra. La aplicación Java de 64 bits puede ser multihilo, pero sólo se permite que un único hilo de aplicación Java interopere a través del límite AMODE. Si una segunda hebra de aplicación intenta cargar una biblioteca de 31 bits o llamar a una función C o C++ de 31 bits, normalmente se genera un java.lang.UnsatisfiedLinkError.
- Debe compilar la aplicación nativa de 31 bits con el enlace CALL estándar; no se da soporte a XPLINK.
- El soporte de manejo de condición de LE no está disponible en el límite de AMODE. Específicamente, no se da soporte a
-XCEEHDLR,-Xsignal:userConditionHandler=percolatey las opciones relacionadas. Las condiciones LE no se convierten en excepciones Java. - El encadenamiento de señales no está soportado en el límite de AMODE.
- Las variables de entorno solo se copian en el límite de AMODE en la primera transición. Las actualizaciones posteriores en un entorno AMODE no se propagan una a la otra; en lugar de esto, las variables se rastrean por separado en cada entorno AMODE. Para obtener más información, consulte Propagación de variables de entorno al Language Environment secundario en Introducción a los programas AMODE 31 y AMODE 64.
Procedimiento
Resultados
-XX:+Enable3164Interoperability en la línea de mandatos o en la API JNI_CreateJavaVM al ejecutar la aplicación:An AMODE64 application is attempting to load an AMODE31 DLL load module.