0Pricing
Java Academy · Lección

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 layout
  • StructLayout: campos dispuestos secuencialmente
  • UnionLayout: 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, StructLayout y UnionLayout
  • Asigne nombres a los campos con withName; acceda a ellos mediante VarHandle y elementos de ruta
  • Añada paddingLayout explí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

  1. Por qué FFM en lugar de JNI
  2. MemorySegment y Arena
  3. Handles de downcall
  4. Layouts y structs
← Volver a Java Academy