Skip to content

Commit 0c4d7e9

Browse files
Load a class via JNI
1 parent b2a04ed commit 0c4d7e9

File tree

9 files changed

+1408
-0
lines changed

9 files changed

+1408
-0
lines changed

lib/java/os-environment/src/main/java/org/enso/os/environment/jni/JNI.java

Lines changed: 860 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.enso.os.environment.jni;
2+
3+
import org.graalvm.nativeimage.c.CContext;
4+
import org.graalvm.nativeimage.c.function.CFunction;
5+
import org.graalvm.nativeimage.c.function.CFunctionPointer;
6+
import org.graalvm.nativeimage.c.function.InvokeCFunctionPointer;
7+
import org.graalvm.nativeimage.c.struct.CField;
8+
import org.graalvm.nativeimage.c.struct.CStruct;
9+
import org.graalvm.nativeimage.c.type.CCharPointer;
10+
import org.graalvm.nativeimage.c.type.WordPointer;
11+
import org.graalvm.word.PointerBase;
12+
13+
/** Java virtual machine initialization API. */
14+
@CContext(JNIDirectives.class)
15+
final class JNIBoot {
16+
@CFunction
17+
static native int JNI_GetDefaultJavaVMInitArgs(Args vmargs);
18+
19+
public interface JNICreateJavaVMPointer extends CFunctionPointer {
20+
@InvokeCFunctionPointer
21+
int call(JNI.JavaVMPointer jvmptr, JNI.JNIEnvPointer env, Args args);
22+
}
23+
24+
@CStruct("JavaVMInitArgs")
25+
interface Args extends PointerBase {
26+
@CField
27+
int version();
28+
29+
@CField
30+
void version(int v);
31+
32+
@CField
33+
int nOptions();
34+
35+
@CField
36+
void nOptions(int n);
37+
38+
@CField
39+
Option options();
40+
41+
@CField
42+
void options(Option ptr);
43+
44+
@CField
45+
boolean ignoreUnrecognized();
46+
47+
@CField
48+
void ignoreUnrecognized(boolean v);
49+
}
50+
51+
@CStruct(value = "JavaVMOption")
52+
public interface Option extends PointerBase {
53+
54+
@CField("optionString")
55+
CCharPointer getOptionString();
56+
57+
@CField("optionString")
58+
void setOptionString(CCharPointer value);
59+
60+
@CField("extraInfo")
61+
WordPointer getExtraInfo();
62+
63+
@CField("extraInfo")
64+
void setExtraInfo(WordPointer value);
65+
66+
Option addressOf(int index);
67+
}
68+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.enso.os.environment.jni;
2+
3+
import java.io.File;
4+
import java.util.List;
5+
import org.graalvm.nativeimage.c.CContext;
6+
7+
final class JNIDirectives implements CContext.Directives {
8+
9+
@Override
10+
public List<String> getLibraryPaths() {
11+
var javaHome = new File(System.getProperty("java.home"));
12+
var libServer = new File(new File(javaHome, "lib"), "server");
13+
return List.of(libServer.getPath());
14+
}
15+
16+
@Override
17+
public List<String> getLibraries() {
18+
return List.of("jvm");
19+
}
20+
21+
@Override
22+
public List<String> getOptions() {
23+
var javaHome = new File(System.getProperty("java.home"));
24+
var include = new File(javaHome, "include");
25+
assert include.isDirectory();
26+
var jni = new File(include, "jni.h");
27+
assert jni.canRead();
28+
for (var subDir : include.listFiles()) {
29+
var md = new File(subDir, "jni_md.h");
30+
if (md.canRead()) {
31+
var q = "\"";
32+
var includes = List.of("-I", jni.getParent(), "-I", md.getParent());
33+
return includes;
34+
}
35+
}
36+
throw new AssertionError("Cannot find libs in " + javaHome);
37+
}
38+
39+
@Override
40+
public List<String> getHeaderFiles() {
41+
return List.of("<jni.h>", "<jni_md.h>");
42+
}
43+
}

0 commit comments

Comments
 (0)