2
2
3
3
import imgui .enums .ImGuiInputTextFlags ;
4
4
5
+ import java .io .IOException ;
6
+ import java .io .InputStream ;
7
+ import java .io .UncheckedIOException ;
5
8
import java .nio .ByteBuffer ;
9
+ import java .nio .file .Files ;
10
+ import java .nio .file .Path ;
11
+ import java .nio .file .Paths ;
12
+ import java .nio .file .StandardCopyOption ;
6
13
7
14
public final class ImGui {
15
+ private static final String LIB_PATH_PROP = "imgui.library.path" ;
8
16
private static final String LIB_NAME_PROP = "imgui.library.name" ;
9
17
private static final String LIB_NAME_DEFAULT = System .getProperty ("os.arch" ).contains ("64" ) ? "imgui-java64" : "imgui-java" ;
18
+ private static final String LIB_TMP_DIR_PREFIX = "imgui-java-bin_" + System .getProperty ("user.name" , "user" );
10
19
11
20
private static final ImDrawData DRAW_DATA = new ImDrawData (100_000 , 100_000 , 1000 );
12
21
private static final ImGuiIO IMGUI_IO = new ImGuiIO ();
@@ -17,13 +26,61 @@ public final class ImGui {
17
26
private static final ImDrawList IM_DRAW_LIST_FOREGROUND = new ImDrawList (ImDrawList .TYPE_FOREGROUND );
18
27
19
28
static {
20
- System .loadLibrary (System .getProperty (LIB_NAME_PROP , LIB_NAME_DEFAULT ));
21
- initJni ();
29
+ final String libPath = System .getProperty (LIB_PATH_PROP );
30
+ final String libName = System .getProperty (LIB_NAME_PROP , LIB_NAME_DEFAULT );
31
+ final String fullLibName = resolveFullLibName ();
32
+
33
+ final String extractedLibAbsPath = tryLoadFromClasspath (fullLibName );
34
+
35
+ if (extractedLibAbsPath != null ) {
36
+ System .load (extractedLibAbsPath );
37
+ } else if (libPath != null ) {
38
+ System .load (Paths .get (libPath ).resolve (fullLibName ).toFile ().getAbsolutePath ());
39
+ } else {
40
+ System .loadLibrary (libName );
41
+ }
42
+
43
+ nInitJni ();
22
44
ImDrawList .nInit ();
23
45
ImDrawData .nInit ();
24
46
nInitInputTextData ();
25
47
}
26
48
49
+ private static String resolveFullLibName () {
50
+ final boolean isWin = System .getProperty ("os.name" ).toLowerCase ().contains ("win" );
51
+ final String libPrefix ;
52
+ final String libSuffix ;
53
+
54
+ if (isWin ) {
55
+ libPrefix = "" ;
56
+ libSuffix = ".dll" ;
57
+ } else { // Only linux as an alternative OS
58
+ libPrefix = "lib" ;
59
+ libSuffix = ".so" ;
60
+ }
61
+
62
+ return System .getProperty (LIB_NAME_PROP , libPrefix + LIB_NAME_DEFAULT + libSuffix );
63
+ }
64
+
65
+ // This method tries to unpack the library binary from classpath into the temp dir.
66
+ private static String tryLoadFromClasspath (final String fullLibName ) {
67
+ try (InputStream is = ImGui .class .getClassLoader ().getResourceAsStream ("io/imgui/java/native-bin/" + fullLibName )) {
68
+ if (is == null ) {
69
+ return null ;
70
+ }
71
+
72
+ final Path tmpDir = Paths .get (System .getProperty ("java.io.tmpdir" )).resolve (LIB_TMP_DIR_PREFIX );
73
+ tmpDir .toFile ().mkdirs ();
74
+
75
+ final Path libBin = tmpDir .resolve (fullLibName );
76
+ Files .copy (is , libBin , StandardCopyOption .REPLACE_EXISTING );
77
+
78
+ return libBin .toFile ().getAbsolutePath ();
79
+ } catch (IOException e ) {
80
+ throw new UncheckedIOException (e );
81
+ }
82
+ }
83
+
27
84
private ImGui () {
28
85
}
29
86
@@ -34,7 +91,7 @@ private ImGui() {
34
91
#include "jni_callbacks.h"
35
92
*/
36
93
37
- private static native void initJni (); /*
94
+ private static native void nInitJni (); /*
38
95
Jni::InitCommon(env);
39
96
Jni::InitCallbacks(env);
40
97
*/
0 commit comments