0Pricing
Java Academy · Aula

Layouts e structs

Descreva layouts de memória nativa.

Layouts e structs é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

Descrevendo a memória nativa

Os dados nativos raramente são um único valor. C usa estruturas, vetores e uniões. FFM modela essas formas com descrições de memória, permitindo ler e gravar memória nativa estruturada com segurança.

A família de descrições

Os tipos de descrição formam uma pequena hierarquia:

  • ValueLayout: um tipo primitivo (inteiro, inteiro longo, número de ponto flutuante, endereço)
  • SequenceLayout: um vetor de tamanho fixo de uma descrição
  • StructLayout: campos dispostos sequencialmente
  • UnionLayout: campos sobrepostos

Uma descrição de valor

As descrições mais simples são as descrições de valor incorporadas. Elas carregam tamanho, alinhamento e ordem dos 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());
    }
}

Definindo uma estrutura

Modele uma estrutura C com MemoryLayout.structLayout(...), nomeando cada campo com withName. Considere a estrutura C struct Point { int x; int y; }.

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());
    }
}

Identificadores de variável para campos

Para ler ou gravar um campo nomeado, derive um VarHandle usando uma expressão de caminho. groupElement("x") seleciona o campo pelo nome.

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);
    }
}

Lendo e gravando uma estrutura

Aloque um segmento com tamanho definido pela descrição e use os identificadores de variável para definir e obter os campos. Isso reproduz o preenchimento de uma estrutura 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) + ")");
        }
    }
}

Preenchimento e alinhamento

Os compiladores C inserem preenchimento para que os campos fiquem alinhados. FFM não o adiciona automaticamente, portanto você precisa incluir MemoryLayout.paddingLayout(n) para corresponder exatamente à descrição C.

Um alinhamento incorreto corrompe todos os campos depois do espaço.

Exemplo de preenchimento explícito

Para struct { char c; int n; }, o inteiro precisa estar alinhado em 4 bytes, portanto 3 bytes de preenchimento vêm depois do caractere.

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());
    }
}

Descrições de sequência

Uma SequenceLayout descreve um vetor. MemoryLayout.sequenceLayout(count, element) modela, por exemplo, um vetor de 10 números de ponto flutuante de precisão dupla.

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());
    }
}

Descrições aninhadas

As descrições podem ser compostas. Uma estrutura pode conter uma sequência, e uma sequência pode conter estruturas. Expressões de caminho como sequenceElement() e groupElement(name) percorrem dados aninhados em profundidade.

Isso permite lidar com estruturas de dados C reais de complexidade arbitrária.

Deslocamentos e segmentação

Você pode consultar o byteOffset de um campo a partir do seu caminho e usar segment.asSlice(offset, size) para obter um subsegmento, útil para passar um campo de uma estrutura a uma função nativa.

Verificação rápida

Lembre-se de uma armadilha comum com estruturas.

Recapitulação

Você aprendeu a descrever dados nativos:

  • Família de descrições: ValueLayout, SequenceLayout, StructLayout, UnionLayout
  • Nomeie os campos com withName; acesse-os por meio de VarHandle e elementos de caminho
  • Adicione paddingLayout explícito para obter o alinhamento correto
  • Componha descrições aninhadas e faça segmentações com asSlice

Isso conclui o curso da API de Funções Estrangeiras e Memória.

Perguntas Frequentes

A aula “Layouts e structs” é grátis?

Sim — o texto completo de “Layouts e structs” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Layouts e structs”?

Descreva layouts de memória nativa. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Layouts e structs”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que FFM em vez de JNI
  2. MemorySegment e Arena
  3. Handles de downcall
  4. Layouts e structs
← Voltar para Java Academy