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 + +