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 @@ + + 4.0.0 + + com.baeldung.java.panama + java-panama + 1.0-SNAPSHOT + jar + + java-panama + https://maven.apache.org + + + UTF-8 + 19 + 19 + 3.10.1 + + + + + org.junit.jupiter + junit-jupiter + 5.9.0 + 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/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); + } + } +}