Layouts y structs
Describa las distribuciones de memoria nativa
Layouts y structs es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Describir la memoria nativa
Los datos nativos rara vez constan de un único valor. C utiliza estructuras, arrays y uniones. FFM modela estas formas mediante layouts de memoria, lo que permite leer y escribir memoria nativa estructurada de forma segura.
La familia de layouts
Los tipos de layout forman una pequeña jerarquía:
ValueLayout: un tipo primitivo (int, long, double o dirección)SequenceLayout: un array de tamaño fijo de un layoutStructLayout: campos dispuestos secuencialmenteUnionLayout: campos superpuestos
Un layout de valores
Los layouts más sencillos son los layouts de valores integrados. Contienen el tamaño, la alineación y el orden de bytes.
import java.lang.foreign.ValueLayout;
public class Main {
public static void main(String[] args) {
System.out.println("int size: " + ValueLayout.JAVA_INT.byteSize());
System.out.println("double size: " + ValueLayout.JAVA_DOUBLE.byteSize());
}
}Definir una estructura
Modele una estructura de C con MemoryLayout.structLayout(...) y asigne un nombre a cada campo con withName. Considere struct Point { int x; int y; } de C.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
System.out.println("Point size: " + point.byteSize());
}
}VarHandle para campos
Para leer o escribir un campo con nombre, obtenga un VarHandle mediante una expresión de ruta. groupElement("x") selecciona el campo por su nombre.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xHandle = point.varHandle(
MemoryLayout.PathElement.groupElement("x"));
System.out.println("Built VarHandle for x: " + xHandle);
}
}Leer y escribir una estructura
Asigne un segmento cuyo tamaño corresponda al layout y, después, utilice los var handles para establecer y obtener los campos. Esto equivale a rellenar una estructura de C.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xh = point.varHandle(MemoryLayout.PathElement.groupElement("x"));
VarHandle yh = point.varHandle(MemoryLayout.PathElement.groupElement("y"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment p = arena.allocate(point);
xh.set(p, 0L, 3);
yh.set(p, 0L, 4);
System.out.println("Point = (" + xh.get(p, 0L) + ", " + yh.get(p, 0L) + ")");
}
}
}Relleno y alineación
Los compiladores de C insertan relleno para alinear los campos. FFM no lo añade automáticamente, por lo que debe incluir MemoryLayout.paddingLayout(n) para coincidir exactamente con el layout de C.
Si la alineación es incorrecta, se corromperán todos los campos posteriores al hueco.
Ejemplo de relleno explícito
En struct { char c; int n; }, el int debe estar alineado en 4 bytes, por lo que después del char hay 3 bytes de relleno.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout s = MemoryLayout.structLayout(
ValueLayout.JAVA_BYTE.withName("c"),
MemoryLayout.paddingLayout(3),
ValueLayout.JAVA_INT.withName("n"));
System.out.println("Aligned struct size: " + s.byteSize());
}
}Layouts de secuencia
Un SequenceLayout describe un array. MemoryLayout.sequenceLayout(count, element) modela, por ejemplo, un array de 10 valores double.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
SequenceLayout arr = MemoryLayout.sequenceLayout(10, ValueLayout.JAVA_DOUBLE);
System.out.println("Array bytes: " + arr.byteSize());
}
}Layouts anidados
Los layouts se pueden combinar. Una estructura puede contener una secuencia y una secuencia puede contener estructuras. Las expresiones de ruta, como sequenceElement() y groupElement(name), permiten navegar por datos anidados en profundidad.
Esto permite manejar estructuras de datos de C reales con cualquier nivel de complejidad.
Desplazamientos y segmentación
Puede consultar el byteOffset de un campo a partir de su ruta y utilizar segment.asSlice(offset, size) para obtener un subsegmento, lo que resulta útil para pasar un campo de una estructura a una función nativa.
Comprobación rápida
Recuerde un error frecuente con las estructuras.
Resumen
Ha aprendido a describir datos nativos:
- Familia de layouts:
ValueLayout,SequenceLayout,StructLayoutyUnionLayout - Asigne nombres a los campos con
withName; acceda a ellos medianteVarHandley elementos de ruta - Añada
paddingLayoutexplícitamente para obtener una alineación correcta - Combine layouts anidados y cree segmentos parciales con
asSlice
Con esto finaliza el curso sobre la Foreign Function and Memory API.
Preguntas frecuentes
¿La lección «Layouts y structs» es gratis?
Sí — el texto completo de «Layouts y structs» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Layouts y structs»?
Describa las distribuciones de memoria nativa Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Layouts y structs»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué FFM en lugar de JNI
- MemorySegment y Arena
- Handles de downcall
- Layouts y structs