Layouter och structs
Beskriv layouter för native-minne.
Layouter och structs är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Beskriva native-minne
Nativedata är sällan ett enda värde. C använder structar, arrayer och unioner. FFM modellerar dessa strukturer med minneslayouter, så att du kan läsa och skriva strukturerat native-minne på ett säkert sätt.
Layoutfamiljen
Layouttyperna bildar en liten hierarki:
ValueLayout: ett primitivt värde (int, long, double, address)SequenceLayout: en array med fast storlek och en viss layoutStructLayout: fält som ligger sekventielltUnionLayout: överlappande fält
En värdelayout
De enklaste layouterna är de inbyggda värdelayouterna. De innehåller information om storlek, justering och byteordning.
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());
}
}Definiera en struct
Modellera en C-struct med MemoryLayout.structLayout(...) och namnge varje fält med withName. Tänk på C:s 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());
}
}VarHandle för fält
För att läsa eller skriva ett namngivet fält härleder du ett VarHandle med hjälp av ett sökvägsuttryck. groupElement("x") väljer fältet utifrån dess namn.
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);
}
}Läsa och skriva en struct
Allokera ett segment med layoutens storlek och använd sedan VarHandle-objekten för att ange och hämta fält. Det motsvarar att fylla i en C-struct.
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) + ")");
}
}
}Utfyllnad och justering
C-kompilatorer lägger in utfyllnad så att fälten blir korrekt justerade. FFM lägger inte till den automatiskt, så du måste inkludera MemoryLayout.paddingLayout(n) för att exakt matcha C-layouten.
Om justeringen blir fel skadas varje fält efter mellanrummet.
Exempel på explicit utfyllnad
För struct { char c; int n; } måste int justeras till 4 byte, så 3 utfyllnadsbyte följer efter char-fältet.
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());
}
}Sekvenslayouter
En SequenceLayout beskriver en array. MemoryLayout.sequenceLayout(count, element) modellerar till exempel en array med 10 double-värden.
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());
}
}Nästlade layouter
Layouter kan kombineras. En struct kan innehålla en sekvens och en sekvens kan innehålla structar. Sökvägsuttryck som sequenceElement() och groupElement(name) navigerar djupt in i nästlade data.
Detta hanterar verkliga C-datastrukturer med godtycklig komplexitet.
Offset och slicing
Du kan hämta ett fälts byteOffset från dess sökväg och använda segment.asSlice(offset, size) för att skapa ett delsegment. Det är användbart när du vill skicka ett enskilt structfält till en nativefunktion.
Snabbtest
Kom ihåg en vanlig fallgrop med structar.
Sammanfattning
Du har lärt dig att beskriva nativedata:
- Layoutfamiljen:
ValueLayout,SequenceLayout,StructLayout,UnionLayout - Namnge fält med
withNameoch få åtkomst viaVarHandleoch sökvägselement - Lägg till explicit
paddingLayoutför korrekt justering - Kombinera nästlade layouter och skapa delsegment med
asSlice
Detta avslutar kursen om Foreign Function and Memory API.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Layouter och structs” gratis?
Ja – hela texten till ”Layouter och structs” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Layouter och structs”?
Beskriv layouter för native-minne. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Layouter och structs”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför FFM i stället för JNI
- MemorySegment och Arena
- Downcall-handtag
- Layouter och structs