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çãoStructLayout: campos dispostos sequencialmenteUnionLayout: 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 deVarHandlee elementos de caminho - Adicione
paddingLayoutexplí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
- Por que FFM em vez de JNI
- MemorySegment e Arena
- Handles de downcall
- Layouts e structs