Netbeans 似乎无法在java Web Start中加载DLL

Netbeans 似乎无法在java Web Start中加载DLL,netbeans,dll,java-native-interface,java-web-start,sigar,Netbeans,Dll,Java Native Interface,Java Web Start,Sigar,我的java webstart应用程序遇到了一个巨大的问题,我尝试了很多解决方案,但最后似乎没有一个能正常工作 我需要编写一个webstart小程序来加载有关客户端计算机的基本硬件信息,以检查我的客户端是否可以连接到我们的系统并在我们的课程中使用该软件。我使用SIGAR加载CPU和内存信息,然后使用JNI加载一个自定义的C++脚本来检查图形卡的名称,这个名称完全可以工作。 我把我所有的DLL都放在src/resources文件夹中,以便将它们加载到jar中,我还使用了我们这里所说的引擎,这些引擎

我的java webstart应用程序遇到了一个巨大的问题,我尝试了很多解决方案,但最后似乎没有一个能正常工作

我需要编写一个webstart小程序来加载有关客户端计算机的基本硬件信息,以检查我的客户端是否可以连接到我们的系统并在我们的课程中使用该软件。我使用SIGAR加载CPU和内存信息,然后使用JNI加载一个自定义的C++脚本来检查图形卡的名称,这个名称完全可以工作。 我把我所有的DLL都放在src/resources文件夹中,以便将它们加载到jar中,我还使用了我们这里所说的引擎,这些引擎在我们的例子中被分类,执行指定的操作,下面是Jni引擎、配置引擎和数据引擎代码,我是webstart的新手,所以我不确定这个概念是否适用于库加载

我尝试将DLL作为Netbeans中的库添加到jar中,我尝试将DLL添加到jnlp中,但每次运行都会重新创建它,并且我无法使用项目属性添加它们。最后,我以一种方式构建了数据引擎,如果DLL不在java temp目录中,应该将它们加载到java temp目录中,但Sigar仍然不想工作。我还将dll正确地放在java.library.path中,因为它在本地工作

当我用右键单击run在本地运行我的主类时,它会工作,但当我单击run按钮加载webstart时,它会崩溃,并显示以下错误消息:它在ConfigEngine中扩展SigarBase时发生:

JNLPClassLoader:查找库sigar-amd64-winnt.dll.dll java.library.path中没有sigar-amd64-winnt.dll org.hyperic.sigar.SigarException:java.library.path中没有sigar-amd64-winnt.dll

代码如下:

JNI引擎加载图形卡< /P>的C++代码

package Engine;
public class JniEngine
{
    static private final String nomLibJni = "JniEngine";
    static private final String nomLibJni64 = "JniEngine_x64";

    static
    {
        if (System.getProperty("os.arch").contains("86"))
        {
            System.loadLibrary(nomLibJni);
        }
        else
        {
            System.loadLibrary(nomLibJni64);
        }
    }

    public native String getInfoGPU() throws Error;
}
配置引擎

package Engine;

import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.cmd.SigarCommandBase;

public class ConfigEngine extends SigarCommandBase
{
    private final String nomOsAcceptes = "Windows";

    static
    {
        DataEngine data;
    }

    public ConfigEngine()
    {
        super();
    }

    @Override
    public void output(String[] args) throws SigarException
    {
    }

    public HashMap<String, String> getMap() throws SigarException, SocketException
    {
        HashMap<String, String> hmConfig = new HashMap<>();
        loadInfoCpu(hmConfig);
        loadInfoRam(hmConfig);
        loadInfoOs(hmConfig);
        loadInfoNet(hmConfig);
        loadInfoGpu(hmConfig);
        return hmConfig;
    }

    private void loadInfoCpu(HashMap<String,String> Hashmap) throws SigarException
    {
        org.hyperic.sigar.CpuInfo[] configCpu = this.sigar.getCpuInfoList();
        org.hyperic.sigar.CpuInfo infoCpu = configCpu[0];
        long cacheSize = infoCpu.getCacheSize();
        Hashmap.put("Builder", infoCpu.getVendor());
        Hashmap.put("Model" , infoCpu.getModel());
        Hashmap.put("Mhz", String.valueOf(infoCpu.getMhz()));
        Hashmap.put("Cpus nbr", String.valueOf(infoCpu.getTotalCores()));
        if ((infoCpu.getTotalCores() != infoCpu.getTotalSockets()) || 
                (infoCpu.getCoresPerSocket() > infoCpu.getTotalCores()))
        {
            Hashmap.put("Cpus", String.valueOf(infoCpu.getTotalSockets()));
            Hashmap.put("Core", String.valueOf(infoCpu.getCoresPerSocket()));
        }
        if (cacheSize != Sigar.FIELD_NOTIMPL) {
            Hashmap.put("Cache", String.valueOf(cacheSize));
        }
    }

    private void loadInfoRam(HashMap<String,String> Hashmap) throws SigarException
    {
        org.hyperic.sigar.Mem mem = this.sigar.getMem();
        Hashmap.put("RAM" , String.valueOf(mem.getRam()));
        Hashmap.put("Memoery", String.valueOf(mem.getTotal()));
        Hashmap.put("Free", String.valueOf(mem.getUsed()));
    }

    private void loadInfoOs(HashMap<String,String> Hashmap) throws SigarException
    {
        Hashmap.put("OS", System.getProperty("os.name"));
        Hashmap.put("Version", System.getProperty("os.version"));
        Hashmap.put("Arch", System.getProperty("os.arch"));
    }

    private void loadInfoNet(HashMap<String,String> Hashmap) throws SocketException
    {
        List<NetworkInterface> interfaces = Collections.
                                    list(NetworkInterface.getNetworkInterfaces());
        int i = 1;
        for (NetworkInterface net : interfaces)
        {
            if (!net.isVirtual() && net.isUp())
            {
                Hashmap.put("Port Name " + String.valueOf(i), net.getDisplayName());
            }
            i++;
        }
    }

    private void loadInfoGpu(HashMap<String,String> Hashmap) throws SocketException
    {
        if (System.getProperty("os.name").contains(nomOsAcceptes))
        {
            JniEngine Jni = new JniEngine();
            Hashmap.put("VGA", Jni.getInfoGPU());
        }
    }
}
我的主类NetBeans也有一些问题,我不希望我的JAppletForm成为我项目的主类,但我可能会重新创建项目,因为我尝试的数百个补丁已经破坏了构建。我的主类只需使用ConfigEngine的GetMap加载HashMap,并在控制台(如果是本地的)中显示它,或者在使用webstart运行的JAppletForm中显示它

这是一个相当大的问题,因此如果有人问我,我会用你需要的所有信息更新我的问题。

可能重复使用JNLP不会对解包和加载本机库产生影响。@AlexBarker使用JNLP不会对解包和加载本机库产生影响。如果JWS客户机解压本机并将它们放在应用程序的运行时类路径上,则确实如此。所有Java代码需要做的就是加载本机并使用它。
package Engine;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;

public class DataEngine
{
    static private final String nomLibSigar = "sigar-x86-winnt";
    static private final String nomLibSigar64 = "sigar-amd64-winnt";
    static private final String nomLibJni = "JniEngine";
    static private final String nomLibJni64 = "JniEngine_x64";
    static private final String NomJar86 = "lib_config_x86";
    static private final String nomJar64 = "lib_config_x64";
    static private final String path = "Resources\\";

    static
    {
        try
        {
            if (System.getProperty("os.arch").contains("86"))
            {
                System.loadLibrary(nomLibJni);
                System.loadLibrary(nomLibSigar);
            }
            else
            {
                System.loadLibrary(nomLibJni64);
                System.loadLibrary(nomLibSigar64);
            }
        }
        catch (UnsatisfiedLinkError ex)
        {
            loadJniFromJar();
            loadSigarFromJar();
        }
    }

    public static void loadSigarFromJar()
    {
        try
        {
            File dll;
            InputStream is;
            if (System.getProperty("os.arch").contains("86"))
            {
                is = DataEngine.class.getResourceAsStream(
                        path + nomLibSigar + ".dll");
                dll = File.createTempFile(path + nomLibSigar, ".dll");
            }
            else
            {
                is = DataEngine.class.getResourceAsStream(
                        path + nomLibSigar64 + ".dll");
                dll = File.createTempFile(path + nomLibSigar64, ".dll");
            }
            FileOutputStream fos = new FileOutputStream(dll);
            byte[] array = new byte[1024];
            for (int i = is.read(array);
                    i != -1;
                    i = is.read(array))
            {
                fos.write(array, 0, i);
            }
            fos.close();
            is.close();
            System.load(dll.getAbsolutePath());
            System.setProperty("java.library.path", dll.getAbsolutePath()); 
        }
        catch (Throwable e)
        {
        }
    }

    public static void loadJniFromJar()
    {
        try
        {
            File dll;
            InputStream is;
            if (System.getProperty("os.arch").contains("86"))
            {
                is = DataEngine.class.getResourceAsStream(
                        path + nomLibJni + ".dll");
                dll = File.createTempFile(path + nomLibJni, ".dll");
            }
            else
            {
                is = DataEngine.class.getResourceAsStream(
                        path + nomLibJni64 + ".dll");
                dll = File.createTempFile(path + nomLibJni64, ".dll");
            }
            FileOutputStream fos = new FileOutputStream(dll);
            byte[] array = new byte[1024];
            for (int i = is.read(array);
                    i != -1;
                    i = is.read(array))
            {
                fos.write(array, 0, i);
            }
            fos.close();
            is.close();
            System.load(dll.getAbsolutePath());
        }
        catch (Throwable e)
        {
        }
    }
}