Skip to content

Commit 08df061

Browse files
Merge pull request #39 from dreamlike-ocean/native-example
Native example
2 parents fb317a5 + 9528a66 commit 08df061

50 files changed

Lines changed: 1793 additions & 368 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

example/pom.xml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
</execution>
9595
</executions>
9696
<configuration>
97-
<jvmTarget>1.8</jvmTarget>
97+
<jvmTarget>17</jvmTarget>
9898
</configuration>
9999
</plugin>
100100
<plugin>
@@ -124,6 +124,13 @@
124124
</goals>
125125
</execution>
126126
</executions>
127+
<configuration>
128+
<target>${java.version}</target>
129+
<source>${java.version}</source>
130+
<compilerArgs>
131+
<compilerArg>--enable-preview</compilerArg>
132+
</compilerArgs>
133+
</configuration>
127134
</plugin>
128135
</plugins>
129136
</build>

graal-native-example/pom.xml

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>io.github.dreamlike-ocean</groupId>
8+
<artifactId>PanamaUring</artifactId>
9+
<version>1.0</version>
10+
</parent>
11+
12+
<groupId>top.dreamlike</groupId>
13+
<artifactId>graal-native-example</artifactId>
14+
15+
<properties>
16+
<maven.compiler.source>21</maven.compiler.source>
17+
<maven.compiler.target>21</maven.compiler.target>
18+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19+
<graal.feature>top.dreamlike.graal.PanamaFeature</graal.feature>
20+
<main.class>top.dreamlike.Main</main.class>
21+
</properties>
22+
<profiles>
23+
<profile>
24+
<id>native-release</id>
25+
<build>
26+
<plugins>
27+
<plugin>
28+
<groupId>org.graalvm.buildtools</groupId>
29+
<artifactId>native-maven-plugin</artifactId>
30+
<version>0.9.28</version>
31+
<extensions>true</extensions>
32+
<executions>
33+
<execution>
34+
<id>build-native</id>
35+
<goals>
36+
<goal>compile-no-fork</goal>
37+
</goals>
38+
<phase>package</phase>
39+
</execution>
40+
</executions>
41+
<configuration>
42+
<buildArgs>
43+
<buildArg>--enable-native-access=ALL-UNNAMED</buildArg>
44+
<buildArg>--no-fallback</buildArg>
45+
<buildArg>--enable-preview</buildArg>
46+
<buildArg>--features=${graal.feature}</buildArg>
47+
<buildArg>-O3</buildArg>
48+
<buildArg>--gc=G1</buildArg>
49+
<buildArg>-march=native</buildArg>
50+
</buildArgs>
51+
<skipNativeTests>true</skipNativeTests>
52+
<mainClass>${main.class}</mainClass>
53+
</configuration>
54+
</plugin>
55+
</plugins>
56+
</build>
57+
</profile>
58+
59+
<profile>
60+
<id>native-debug</id>
61+
<build>
62+
<plugins>
63+
<plugin>
64+
<groupId>org.graalvm.buildtools</groupId>
65+
<artifactId>native-maven-plugin</artifactId>
66+
<version>0.9.28</version>
67+
<extensions>true</extensions>
68+
<executions>
69+
<execution>
70+
<id>build-native</id>
71+
<goals>
72+
<goal>compile-no-fork</goal>
73+
</goals>
74+
<phase>package</phase>
75+
</execution>
76+
</executions>
77+
<configuration>
78+
<buildArgs>
79+
<buildArg>--enable-native-access=ALL-UNNAMED</buildArg>
80+
<buildArg>--no-fallback</buildArg>
81+
<buildArg>--enable-preview</buildArg>
82+
<buildArg>--features=${graal.feature}</buildArg>
83+
<buildArg>-Ob</buildArg>
84+
<buildArg>-g</buildArg>
85+
</buildArgs>
86+
<skipNativeTests>true</skipNativeTests>
87+
<mainClass>${main.class}</mainClass>
88+
</configuration>
89+
</plugin>
90+
</plugins>
91+
</build>
92+
</profile>
93+
</profiles>
94+
95+
<dependencies>
96+
<dependency>
97+
<groupId>org.graalvm.sdk</groupId>
98+
<artifactId>nativeimage</artifactId>
99+
<version>23.1.1</version>
100+
<scope>provided</scope>
101+
</dependency>
102+
103+
<dependency>
104+
<groupId>io.github.dreamlike-ocean</groupId>
105+
<artifactId>panama-generator</artifactId>
106+
<version>1.1</version>
107+
</dependency>
108+
</dependencies>
109+
<build>
110+
<plugins>
111+
<plugin>
112+
<groupId>org.apache.maven.plugins</groupId>
113+
<artifactId>maven-compiler-plugin</artifactId>
114+
<configuration>
115+
<target>${java.version}</target>
116+
<source>${java.version}</source>
117+
<useIncrementalCompilation>false</useIncrementalCompilation>
118+
<annotationProcessors>
119+
<annotationProcessor>
120+
top.dreamlike.panama.generator.proxy.PanamaAnnotationProcessor
121+
</annotationProcessor>
122+
</annotationProcessors>
123+
<compilerArgs>
124+
<compilerArg>-Aindy.enable=false</compilerArg>
125+
<compilerArg>-Agenerate.graal.feature.enable=true</compilerArg>
126+
<compilerArg>-Agenerate.graal.feature.name=${graal.feature}</compilerArg>
127+
<compilerArg>--enable-preview</compilerArg>
128+
</compilerArgs>
129+
</configuration>
130+
</plugin>
131+
<plugin>
132+
<artifactId>maven-shade-plugin</artifactId>
133+
<version>3.2.4</version>
134+
<executions>
135+
<execution>
136+
<phase>package</phase>
137+
<goals>
138+
<goal>shade</goal>
139+
</goals>
140+
<configuration>
141+
<transformers>
142+
<transformer
143+
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
144+
<manifestEntries>
145+
<Main-Class>${main.class}</Main-Class>
146+
</manifestEntries>
147+
</transformer>
148+
<transformer
149+
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
150+
</transformers>
151+
<outputFile>${project.build.directory}/${project.artifactId}-fat.jar
152+
</outputFile>
153+
</configuration>
154+
</execution>
155+
</executions>
156+
</plugin>
157+
</plugins>
158+
</build>
159+
160+
161+
</project>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package top.dreamlike;
2+
3+
import net.bytebuddy.dynamic.scaffold.TypeWriter;
4+
import top.dreamlike.panama.example.Person;
5+
import top.dreamlike.panama.example.StdLib;
6+
import top.dreamlike.panama.example.TestContainer;
7+
import top.dreamlike.panama.generator.proxy.NativeCallGenerator;
8+
import top.dreamlike.panama.generator.proxy.StructProxyGenerator;
9+
10+
public class Main {
11+
12+
private static final StdLib STD_LIB;
13+
14+
static {
15+
String dumpFolder = System.getProperty(TypeWriter.DUMP_PROPERTY);
16+
System.out.println(dumpFolder);
17+
StructProxyGenerator proxyGenerator = new StructProxyGenerator();
18+
NativeCallGenerator generator = new NativeCallGenerator(proxyGenerator);
19+
STD_LIB = generator.generate(StdLib.class);
20+
proxyGenerator.register(Person.class);
21+
proxyGenerator.register(TestContainer.class);
22+
}
23+
24+
static {
25+
System.load("/usr/lib/x86_64-linux-gnu/libc.so.6");
26+
// MemorySegment address = SymbolLookup.loaderLookup()
27+
// .find("getpid").get();
28+
// getpid$Mh = Linker.nativeLinker()
29+
// .downcallHandle(address, FunctionDescriptor.of(ValueLayout.JAVA_INT), Linker.Option.isTrivial());
30+
}
31+
32+
public static void main(String[] args) throws Throwable {
33+
System.out.println(STR."in native?: \{System.getProperty("org.graalvm.nativeimage.kind")}");
34+
int pid = STD_LIB.getpid();
35+
System.out.println(STR."pid: \{pid}");
36+
int add = STD_LIB.add(10, 10);
37+
System.out.println(STR."add :\{add}");
38+
Person person = STD_LIB.fillPerson(1, 100L);
39+
System.out.println(person);
40+
41+
42+
}
43+
44+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package top.dreamlike.panama.example;
2+
3+
import top.dreamlike.panama.generator.annotation.CompileTimeGenerate;
4+
5+
@CompileTimeGenerate
6+
public class Person {
7+
int a;
8+
long n;
9+
10+
public int getA() {
11+
return a;
12+
}
13+
14+
public void setA(int a) {
15+
this.a = a;
16+
}
17+
18+
public long getN() {
19+
return n;
20+
}
21+
22+
public void setN(long n) {
23+
this.n = n;
24+
}
25+
26+
@Override
27+
public String toString() {
28+
return STR."a: \{getA()}, n: \{getN()}";
29+
}
30+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package top.dreamlike.panama.example;
2+
3+
import top.dreamlike.panama.generator.annotation.CLib;
4+
import top.dreamlike.panama.generator.annotation.CompileTimeGenerate;
5+
import top.dreamlike.panama.generator.annotation.NativeFunction;
6+
7+
8+
@CompileTimeGenerate
9+
@CLib(value = "./libperson.so", inClassPath = false)
10+
public interface StdLib {
11+
@NativeFunction(fast = true)
12+
int getpid();
13+
14+
@NativeFunction(fast = true)
15+
int add(int a, int b);
16+
17+
@NativeFunction(fast = true, returnIsPointer = true)
18+
Person fillPerson(int a, long n);
19+
20+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package top.dreamlike.panama.example;
2+
3+
import top.dreamlike.panama.generator.annotation.CompileTimeGenerate;
4+
import top.dreamlike.panama.generator.annotation.NativeArrayMark;
5+
import top.dreamlike.panama.generator.annotation.Union;
6+
import top.dreamlike.panama.generator.proxy.NativeArray;
7+
8+
@CompileTimeGenerate
9+
public class TestContainer {
10+
int size;
11+
Person single;
12+
13+
UnionStruct unionStruct;
14+
15+
@NativeArrayMark(size = Person.class, length = 3)
16+
NativeArray<Person> personArray;
17+
18+
@NativeArrayMark(size = Person.class, length = 5, asPointer = true)
19+
NativeArray<Person> arrayButPointer;
20+
21+
public int getSize() {
22+
return size;
23+
}
24+
25+
public void setSize(int size) {
26+
this.size = size;
27+
}
28+
29+
public Person getSingle() {
30+
return single;
31+
}
32+
33+
public void setSingle(Person single) {
34+
this.single = single;
35+
}
36+
37+
public UnionStruct getUnionStruct() {
38+
return unionStruct;
39+
}
40+
41+
public void setUnionStruct(UnionStruct unionStruct) {
42+
this.unionStruct = unionStruct;
43+
}
44+
45+
public NativeArray<Person> getPersonArray() {
46+
return personArray;
47+
}
48+
49+
public void setPersonArray(NativeArray<Person> personArray) {
50+
this.personArray = personArray;
51+
}
52+
53+
public NativeArray<Person> getArrayButPointer() {
54+
return arrayButPointer;
55+
}
56+
57+
public void setArrayButPointer(NativeArray<Person> arrayButPointer) {
58+
this.arrayButPointer = arrayButPointer;
59+
}
60+
61+
@Union
62+
@CompileTimeGenerate
63+
public static class UnionStruct {
64+
int union_a;
65+
long union_b;
66+
67+
public int getUnion_a() {
68+
return union_a;
69+
}
70+
71+
public void setUnion_a(int union_a) {
72+
this.union_a = union_a;
73+
}
74+
75+
public long getUnion_b() {
76+
return union_b;
77+
}
78+
79+
public void setUnion_b(long union_b) {
80+
this.union_b = union_b;
81+
}
82+
}
83+
}

libperson.so

16.2 KB
Binary file not shown.

0 commit comments

Comments
 (0)