From 576f9c9eafa17e9f3bb13e2c85d2ef4516620a3c Mon Sep 17 00:00:00 2001
From: exaucae <chrysexaucet@hotmail.fr>
Date: Fri, 11 Nov 2022 23:43:57 +0000
Subject: [PATCH] feat: print hello world with Java down calling C

---
 java-panama/pom.xml                           | 46 +++++++++++++++++++
 .../com/baeldung/java/panama/HelloWorld.java  | 42 +++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 java-panama/pom.xml
 create mode 100644 java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java

diff --git a/java-panama/pom.xml b/java-panama/pom.xml
new file mode 100644
index 0000000000..ad711d0718
--- /dev/null
+++ b/java-panama/pom.xml
@@ -0,0 +1,46 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.baeldung.java.panama</groupId>
+  <artifactId>java-panama</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>java-panama</name>
+  <url>https://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>19</maven.compiler.source>
+    <maven.compiler.target>19</maven.compiler.target>
+    <maven.compiler.version>3.10.1</maven.compiler.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
+      <version>5.9.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>${maven.compiler.version}</version>
+        <configuration>
+          <source>${maven.compiler.source}</source>
+          <target>${maven.compiler.target}</target>
+          <compilerArgs>
+            <arg>--add-opens=java.base/java.lang.foreign=ALL-UNNAMED</arg>
+            <arg>--enable-preview</arg>
+          </compilerArgs>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java
new file mode 100644
index 0000000000..060a8552ef
--- /dev/null
+++ b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java
@@ -0,0 +1,42 @@
+package com.baeldung.java.panama;
+
+import java.lang.foreign.*;
+import java.lang.invoke.MethodHandle;
+import java.util.Objects;
+
+import static java.lang.foreign.ValueLayout.ADDRESS;
+import static java.lang.foreign.ValueLayout.JAVA_INT;
+
+
+public class HelloWorld {
+
+    public static void main(String[] args) throws Throwable {
+
+        String symbolName = "printf";
+        String greetings = "Hello World from Project Panama Baeldung Article";
+
+        Linker nativeLinker = Linker.nativeLinker();
+        SymbolLookup stdlibLookup = nativeLinker.defaultLookup();
+        SymbolLookup loaderLookup = SymbolLookup.loaderLookup();
+
+        FunctionDescriptor functionDescriptor = FunctionDescriptor.of(
+                JAVA_INT.withBitAlignment(32),
+                ADDRESS.withBitAlignment(64)
+        );
+
+        MethodHandle methodHandle =
+                loaderLookup.lookup(symbolName)
+                        .or(() -> stdlibLookup.lookup(symbolName))
+                        .map(
+                                symbolAddress -> nativeLinker.downcallHandle(symbolAddress, functionDescriptor)
+                        ).orElse(null);
+
+
+        Objects.requireNonNull(methodHandle);
+
+        try (MemorySession memorySession = MemorySession.openConfined()) {
+            MemorySegment nativeGreetings = memorySession.allocateUtf8String(greetings + "\n");
+            methodHandle.invoke(nativeGreetings);
+        }
+    }
+}