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