Кажется, не могу загрузить DLL в Java Start

У меня огромная проблема с моим Java-приложением веб-запуска, у меня есть много решений, но ни одно из них не работает правильно в конце.

Мне нужно написать апплет веб-запуска, чтобы загрузить базовую информацию об оборудовании клиентского компьютера, чтобы проверить, может ли мой клиент подключиться к нашим системам и использовать программное обеспечение в течение четырех наших курсов. Я использую Sigar для загрузки информации о процессоре и памяти, а затем использую JNI для загрузки собственного сценария C++, который проверяет имя графической карты (этот работает отлично).

Я поместил все мои dll в папку src / resources, чтобы загрузить их в jar, я также использую то, что мы называем здесь "двигателями", которые классифицируются, которые выполняют определенные операции (В нашем случае, Jni Engine, Config Engine и Data Engine (Код ниже)), я новичок в webstart, поэтому я не уверен, что эта концепция хорошо работает с загрузкой библиотеки.

Я пытаюсь добавить dll в jar как библиотеку в Netbeans, я пытался добавить dll в jnlp, но каждый прогон воссоздает его, и я не могу добавить их со свойствами проекта, finnaly, я построил мой Data Engine таким способом, который должен загружать dll в временный каталог java на случай, если их там нет, но Sigar по-прежнему не хочет работать. Я также поместил мою dll в файл java.library.path, правильно настроенный (как это работает на локальном компьютере).

Он работает, когда я запускаю свой основной класс локально (с помощью щелчка правой кнопкой мыши), но когда я нажимаю кнопку запуска, чтобы загрузить веб-запуск, он выдает сообщение об ошибке (это происходит в ConfigEngine, поскольку он расширяет SigarBase):

JNLPClassLoader: поиск библиотеки sigar-amd64-winnt.dll.dll нет sigar-amd64-winnt.dll в java.library.path org.hyperic.sigar.SigarException: нет sigar-amd64-winnt.dll в java.library.path

Вот код:

JNi Engine (загружает код 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;
}

ConfigEngine

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());
        }
    }
}

Наконец, мой Data Engine, который пытается загрузить все библиотеки DLL и изменить путь к библиотеке (большинство из них являются временными, так как это патчи на патчи)

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)
        {
        }
    }
}

У меня также есть некоторые проблемы с моим основным классом (NetBeans не хочет, чтобы мой JAppletForm был основным классом моего проекта, но, возможно, я все равно воссоздаю проект, так как сотни попыток, которые я пробовал, повредили сборку. Мой основной класс просто загрузите HashMap с GetMap из ConfigEngine и покажите его в консоли, если он локальный, или в JAppletForm, если он работает с веб-запуском.

Это довольно большая проблема, поэтому я обновлю свой вопрос всей информацией, которая вам понадобится, если будет предложено.

0 ответов

Другие вопросы по тегам