diff --git a/java-panama/pom.xml b/java-panama/pom.xml
new file mode 100644
index 0000000000..8453a38abd
--- /dev/null
+++ b/java-panama/pom.xml
@@ -0,0 +1,49 @@
+
+ ${project.model.version}
+
+ com.baeldung.java.panama
+ java-panama
+ ${project.version}
+ jar
+
+ java-panama
+ https://maven.apache.org
+
+
+ 4.0.0
+ UTF-8
+ 1.0
+ 19
+ 19
+ 3.10.1
+ 5.9.0
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.jupiter.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+ --add-opens=java.base/java.lang.foreign=ALL-UNNAMED
+ --enable-preview
+
+
+
+
+
+
diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java
new file mode 100644
index 0000000000..1937bd65e9
--- /dev/null
+++ b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java
@@ -0,0 +1,40 @@
+package com.baeldung.java.panama.core;
+
+import static java.lang.foreign.ValueLayout.ADDRESS;
+import static java.lang.foreign.ValueLayout.JAVA_INT;
+
+import java.lang.foreign.FunctionDescriptor;
+import java.lang.foreign.Linker;
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.MemorySession;
+import java.lang.foreign.SymbolLookup;
+import java.lang.invoke.MethodHandle;
+
+public class Greetings {
+
+ public static void main(String[] args) throws Throwable {
+
+ String symbolName = "printf";
+ String greeting = "Hello World from Project Panama Baeldung Article";
+
+ Linker nativeLinker = Linker.nativeLinker();
+ SymbolLookup stdlibLookup = nativeLinker.defaultLookup();
+ SymbolLookup loaderLookup = SymbolLookup.loaderLookup();
+
+ FunctionDescriptor descriptor = FunctionDescriptor.of(JAVA_INT, ADDRESS);
+
+ MethodHandle methodHandle = loaderLookup.lookup(symbolName)
+ .or(() -> stdlibLookup.lookup(symbolName))
+ .map(symbolSegment -> nativeLinker.downcallHandle(symbolSegment, descriptor))
+ .orElse(null);
+
+ if (methodHandle == null) {
+ throw new NoSuchMethodError("Method Handle was not found");
+ }
+
+ try (MemorySession memorySession = MemorySession.openConfined()) {
+ MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting);
+ methodHandle.invoke(greetingSegment);
+ }
+ }
+}
diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java
new file mode 100644
index 0000000000..239b25b69e
--- /dev/null
+++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java
@@ -0,0 +1,23 @@
+package com.baeldung.java.panama.core;
+
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.MemorySession;
+import java.lang.foreign.SegmentAllocator;
+import java.lang.foreign.ValueLayout;
+
+public class MemoryAllocation {
+
+ public static void main(String[] args) throws Throwable {
+
+ try (MemorySession session = MemorySession.openConfined()) {
+ String[] greetingStrings = { "hello", "world", "panama", "baeldung" };
+ SegmentAllocator allocator = SegmentAllocator.implicitAllocator();
+ MemorySegment offHeapSegment = allocator.allocateArray(ValueLayout.ADDRESS, greetingStrings.length);
+ for (int i = 0; i < greetingStrings.length; i++) {
+ // Allocate a string off-heap, then store a pointer to it
+ MemorySegment cString = allocator.allocateUtf8String(greetingStrings[i]);
+ offHeapSegment.setAtIndex(ValueLayout.ADDRESS, i, cString);
+ }
+ }
+ }
+}
diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java
new file mode 100644
index 0000000000..612997e35e
--- /dev/null
+++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java
@@ -0,0 +1,53 @@
+package com.baeldung.java.panama.core;
+
+import static java.lang.foreign.MemoryLayout.sequenceLayout;
+import static java.lang.foreign.MemoryLayout.structLayout;
+import static java.lang.foreign.ValueLayout.JAVA_DOUBLE;
+import static java.lang.foreign.ValueLayout.JAVA_FLOAT;
+import static java.lang.foreign.ValueLayout.PathElement;
+
+import java.lang.foreign.GroupLayout;
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.MemorySession;
+import java.lang.foreign.SequenceLayout;
+import java.lang.invoke.VarHandle;
+
+public class MemoryLayout {
+
+ public static void main(String[] args) {
+
+ GroupLayout pointLayout = structLayout(JAVA_DOUBLE.withName("x"), JAVA_DOUBLE.withName("y"));
+
+ SequenceLayout ptsLayout = sequenceLayout(10, pointLayout);
+
+ VarHandle xvarHandle = pointLayout.varHandle(PathElement.groupElement("x"));
+ VarHandle yvarHandle = pointLayout.varHandle(PathElement.groupElement("y"));
+
+ try (MemorySession memorySession = MemorySession.openConfined()) {
+
+ MemorySegment pointSegment = memorySession.allocate(pointLayout);
+ xvarHandle.set(pointSegment, 3d);
+ yvarHandle.set(pointSegment, 4d);
+
+ System.out.println(pointSegment.toString());
+
+ }
+
+ }
+
+ static class ValueLayout {
+
+ public static void main(String[] args) {
+
+ try (MemorySession memorySession = MemorySession.openConfined()) {
+ int byteSize = 5;
+ int index = 3;
+ float value = 6;
+ MemorySegment segment = MemorySegment.allocateNative(byteSize, memorySession);
+ segment.setAtIndex(JAVA_FLOAT, index, value);
+ float result = segment.getAtIndex(JAVA_FLOAT, index);
+ System.out.println("Float value is:" + result);
+ }
+ }
+ }
+}
diff --git a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java
new file mode 100644
index 0000000000..43b575d52a
--- /dev/null
+++ b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java
@@ -0,0 +1,19 @@
+package com.baeldung.java.panama.jextract;
+
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.MemorySession;
+// Generate JExtract bindings before uncommenting
+// import static foreign.c.stdio_h.printf;
+
+public class Greetings {
+
+ public static void main(String[] args) {
+ String greeting = "Hello World from Project Panama Baeldung Article, using JExtract!";
+
+ try (MemorySession memorySession = MemorySession.openConfined()) {
+ MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting);
+ // Generate JExtract bingings before uncommenting
+ // printf(greetingSegment);
+ }
+ }
+}
diff --git a/java-panama/src/main/resources/hello.c b/java-panama/src/main/resources/hello.c
new file mode 100644
index 0000000000..3f2d3fce6a
--- /dev/null
+++ b/java-panama/src/main/resources/hello.c
@@ -0,0 +1,5 @@
+#include
+int main() {
+ printf("Hello World from Project Panama Baeldung Article");
+ return 0;
+}
\ No newline at end of file