diff --git a/VirtualComputer-Core/src/main/java/sznp/virtualcomputer/PluginMain.java b/VirtualComputer-Core/src/main/java/sznp/virtualcomputer/PluginMain.java
index 762be30..81cfa77 100644
--- a/VirtualComputer-Core/src/main/java/sznp/virtualcomputer/PluginMain.java
+++ b/VirtualComputer-Core/src/main/java/sznp/virtualcomputer/PluginMain.java
@@ -2,6 +2,7 @@ package sznp.virtualcomputer;
import jnr.ffi.LibraryLoader;
import lombok.val;
+import net.sf.jni4net.Bridge;
import org.bukkit.Bukkit;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.java.JavaPlugin;
@@ -75,7 +76,31 @@ public class PluginMain extends JavaPlugin {
System.setProperty("sun.boot.library.path", vbpath);
if (System.getProperty("java.library.path") == null || System.getProperty("java.library.path").isEmpty())
System.setProperty("java.library.path", vbpath);
- Utils.addLibraryPath(vbpath); //TODO: Jacob DLL must be in the server folder
+ Utils.addLibraryPath(vbpath);
+ if (windows) {
+ ccs.sendMessage("§bExtracting Windows-specific libraries...");
+ final File[] libs = new File[]{
+ new File(getDataFolder(), "jni4net.n-0.8.9.0.dll"),
+ new File(getDataFolder(), "jni4net.n.w64.v40-0.8.9.0.dll"),
+ new File(getDataFolder(), "VirtualComputerWindows.j4n.dll"),
+ new File(getDataFolder(), "VirtualComputerWindows.dll"),
+ new File(getDataFolder(), "Interop.VirtualBox.dll"),
+ new File(getDataFolder(), "Interop.VirtualBox.j4n.dll")
+ };
+
+ for (final File lib : libs) {
+ if (!lib.exists()) {
+ JarUtils.extractFromJar(lib.getName(), lib.getAbsolutePath());
+ }
+ }
+ ccs.sendMessage("§bInitializing bridge...");
+ Bridge.setVerbose(true);
+ //Bridge.init(new File(getDataFolder(), "jni4net.n.w64.v40-0.8.9.0.dll").getAbsoluteFile());
+ Bridge.init(getDataFolder().getAbsoluteFile());
+ Bridge.getSetup().setVeryVerbose(true);
+ Bridge.LoadAndRegisterAssemblyFrom(new File(getDataFolder(), "VirtualComputerWindows.j4n.dll"));
+ Bridge.LoadAndRegisterAssemblyFrom(new File(getDataFolder(), "Interop.VirtualBox.j4n.dll"));
+ }
final VirtualBoxManager manager = VirtualBoxManager.createInstance(getDataFolder().getAbsolutePath());
if (!windows) {
VBoxLib vbl = LibraryLoader.create(VBoxLib.class).load("vboxjxpcom");
diff --git a/VirtualComputerMSCOM/pom.xml b/VirtualComputerMSCOM/pom.xml
index 82cf1ee..04980e5 100644
--- a/VirtualComputerMSCOM/pom.xml
+++ b/VirtualComputerMSCOM/pom.xml
@@ -25,16 +25,38 @@
net.sf.jni4net
clr
0.8.9.0
- system
- ${project.basedir}/src/main/resources/jni4net.j-0.8.9.0.jar
io.github.NorbiPeti
VirtualComputer-Windows
0.8.9.0
- system
- ${project.basedir}/src/main/resources/VirtualComputerWindows.j4n.jar
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.4
+
+
+ package
+
+ shade
+
+
+
+
+
+
+ net.sf.jni4net:clr
+ io.github.NorbiPeti:VirtualComputer-Windows
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/VirtualComputerMSCOM/src/main/java/org/virtualbox_6_1/IVirtualBox.java b/VirtualComputerMSCOM/src/main/java/org/virtualbox_6_1/IVirtualBox.java
index a87681c..9d7176d 100644
--- a/VirtualComputerMSCOM/src/main/java/org/virtualbox_6_1/IVirtualBox.java
+++ b/VirtualComputerMSCOM/src/main/java/org/virtualbox_6_1/IVirtualBox.java
@@ -171,10 +171,10 @@ public interface IVirtualBox {
@net.sf.jni4net.attributes.ClrMethod("()Lorg/virtualbox_6_1/IUnattended;")
IUnattended createUnattendedInstaller();
- @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;LSystem/String;Lorg/virtualbox_6_1/AccessMode;Lorg/virtualbox_6_1/DeviceType;)Lorg/virtualbox_6_1/IMedium;")
+ @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;LSystem/String;Lorg/virtualbox_6_1_FixIt/AccessMode;Lorg/virtualbox_6_1/DeviceType;)Lorg/virtualbox_6_1/IMedium;")
IMedium createMedium_FixIt(String aFormat, String aLocation, org.virtualbox_6_1_FixIt.AccessMode aAccessMode, org.virtualbox_6_1_FixIt.DeviceType aADeviceTypeType);
- @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;Lorg/virtualbox_6_1/DeviceType;Lorg/virtualbox_6_1/AccessMode;I)Lorg/virtualbox_6_1/IMedium;")
+ @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;Lorg/virtualbox_6_1/DeviceType;Lorg/virtualbox_6_1_FixIt/AccessMode;I)Lorg/virtualbox_6_1/IMedium;")
IMedium openMedium_FixIt(String aLocation, org.virtualbox_6_1_FixIt.DeviceType aDeviceType, org.virtualbox_6_1_FixIt.AccessMode aAccessMode, int aForceNewUuid);
@net.sf.jni4net.attributes.ClrMethod("(LSystem/String;)Lorg/virtualbox_6_1/IGuestOSType;")
diff --git a/VirtualComputerMSCOM/src/main/java/sznp/virtualcomputer/JarUtils.java b/VirtualComputerMSCOM/src/main/java/sznp/virtualcomputer/JarUtils.java
new file mode 100644
index 0000000..595ad0c
--- /dev/null
+++ b/VirtualComputerMSCOM/src/main/java/sznp/virtualcomputer/JarUtils.java
@@ -0,0 +1,90 @@
+package sznp.virtualcomputer;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public class JarUtils {
+
+ public static boolean extractFromJar(final String fileName,
+ final String dest) throws IOException {
+ if (getRunningJar() == null) {
+ return false;
+ }
+ final File file = new File(dest);
+ if (file.isDirectory()) {
+ file.mkdir();
+ return false;
+ }
+ if (!file.exists()) {
+ file.getParentFile().mkdirs();
+ }
+
+ final JarFile jar = getRunningJar();
+ final Enumeration e = jar.entries();
+ while (e.hasMoreElements()) {
+ final JarEntry je = e.nextElement();
+ if (!je.getName().contains(fileName)) {
+ continue;
+ }
+ final InputStream in = new BufferedInputStream(
+ jar.getInputStream(je));
+ final OutputStream out = new BufferedOutputStream(
+ new FileOutputStream(file));
+ copyInputStream(in, out);
+ jar.close();
+ return true;
+ }
+ jar.close();
+ return false;
+ }
+
+ private static void copyInputStream(final InputStream in,
+ final OutputStream out) throws IOException {
+ try {
+ final byte[] buff = new byte[4096];
+ int n;
+ while ((n = in.read(buff)) > 0) {
+ out.write(buff, 0, n);
+ }
+ } finally {
+ out.flush();
+ out.close();
+ in.close();
+ }
+ }
+
+ public static URL getJarUrl(final File file) throws IOException {
+ return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
+ }
+
+ public static JarFile getRunningJar() throws IOException {
+ if (!RUNNING_FROM_JAR) {
+ return null; // null if not running from jar
+ }
+ String path = new File(JarUtils.class.getProtectionDomain()
+ .getCodeSource().getLocation().getPath()).getAbsolutePath();
+ path = URLDecoder.decode(path, "UTF-8");
+ return new JarFile(path);
+ }
+
+ private static boolean RUNNING_FROM_JAR = false;
+
+ static {
+ final URL resource = JarUtils.class.getClassLoader().getResource(
+ "plugin.yml");
+ if (resource != null) {
+ RUNNING_FROM_JAR = true;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/VirtualComputerMSCOM/src/main/resources/jni4net.j-0.8.9.0.jar b/VirtualComputerMSCOM/src/main/resources/jni4net.j-0.8.9.0.jar
index 6819919..8f3e382 100644
Binary files a/VirtualComputerMSCOM/src/main/resources/jni4net.j-0.8.9.0.jar and b/VirtualComputerMSCOM/src/main/resources/jni4net.j-0.8.9.0.jar differ
diff --git a/VirtualComputerMSCOM/src/main/resources/jni4net.n-0.8.9.0.dll b/VirtualComputerMSCOM/src/main/resources/jni4net.n-0.8.9.0.dll
index 1dea57f..75d0648 100644
Binary files a/VirtualComputerMSCOM/src/main/resources/jni4net.n-0.8.9.0.dll and b/VirtualComputerMSCOM/src/main/resources/jni4net.n-0.8.9.0.dll differ
diff --git a/VirtualComputerMSCOM/src/main/resources/jni4net.n.w64.v40-0.8.9.0.dll b/VirtualComputerMSCOM/src/main/resources/jni4net.n.w64.v40-0.8.9.0.dll
new file mode 100644
index 0000000..fecf704
Binary files /dev/null and b/VirtualComputerMSCOM/src/main/resources/jni4net.n.w64.v40-0.8.9.0.dll differ
diff --git a/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.jar b/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.jar
new file mode 100644
index 0000000..23b0db3
Binary files /dev/null and b/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.jar differ
diff --git a/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.pom b/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.pom
new file mode 100644
index 0000000..f2a6c0e
--- /dev/null
+++ b/repo/io/github/NorbiPeti/VirtualComputer-Windows/0.8.9.0/VirtualComputer-Windows-0.8.9.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ io.github.NorbiPeti
+ VirtualComputer-Windows
+ 0.8.9.0
+ POM was created from install:install-file
+
diff --git a/repo/io/github/NorbiPeti/VirtualComputer-Windows/maven-metadata-local.xml b/repo/io/github/NorbiPeti/VirtualComputer-Windows/maven-metadata-local.xml
new file mode 100644
index 0000000..e195cc4
--- /dev/null
+++ b/repo/io/github/NorbiPeti/VirtualComputer-Windows/maven-metadata-local.xml
@@ -0,0 +1,12 @@
+
+
+ io.github.NorbiPeti
+ VirtualComputer-Windows
+
+ 0.8.9.0
+
+ 0.8.9.0
+
+ 20201121164706
+
+
diff --git a/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.jar b/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.jar
new file mode 100644
index 0000000..097bef0
Binary files /dev/null and b/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.jar differ
diff --git a/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.pom b/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.pom
new file mode 100644
index 0000000..b851566
--- /dev/null
+++ b/repo/net/sf/jni4net/clr/0.8.9.0/clr-0.8.9.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ net.sf.jni4net
+ clr
+ 0.8.9.0
+ POM was created from install:install-file
+
diff --git a/repo/net/sf/jni4net/clr/maven-metadata-local.xml b/repo/net/sf/jni4net/clr/maven-metadata-local.xml
new file mode 100644
index 0000000..86950e4
--- /dev/null
+++ b/repo/net/sf/jni4net/clr/maven-metadata-local.xml
@@ -0,0 +1,12 @@
+
+
+ net.sf.jni4net
+ clr
+
+ 0.8.9.0
+
+ 0.8.9.0
+
+ 20201121164514
+
+