Пользовательский класс загрузчик для загрузки DLL в апплет - PullRequest
1 голос
/ 13 октября 2011

Для устранения .dll-файла проблема загрузки / выгрузки с апплетами.Я загружаю, следуя этому учебнику , .dll-файлы, используя пользовательский загрузчик классов как:

1- Class Loader (Скопировано из учебник )

public class CustomClassLoader extends ClassLoader {
    private static final String CLASS_NAME = CustomClassLoader.class.getName();

    private Map<String, Class<?>> classes;

    public CustomClassLoader() {
        super(CustomClassLoader.class.getClassLoader());
        classes = new HashMap<String, Class<?>>();
    }

    public String toString() {
        return CustomClassLoader.class.getName();
    }

    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {

        if (classes.containsKey(name)) {
            return classes.get(name);
        }

        String path = name.replace('.', File.separatorChar) + ".class";
        byte[] b = null;

        try {
            b = loadClassData(path);
        } catch (IOException e) {
            throw new ClassNotFoundException("Class not found at path: " + new File(name).getAbsolutePath(), e); **
        }

        Class<?> c = defineClass(name, b, 0, b.length);
        resolveClass(c);
        classes.put(name, c);

        return c;
    }

    private byte[] loadClassData(String name) throws IOException {
        String methodName = CLASS_NAME + ".loadClassData";
        byte buff[] = null;

        try {
            File file = new File(name);
            int size = (int) file.length();
            buff = new byte[size];
            DataInputStream in = new DataInputStream(new FileInputStream(name));
            in.readFully(buff);
            in.close();

        } catch (IOException e) {
            throw new IOException(e.getMessage());
        }
        return buff;
    }
}

2 - класс для загрузки DLL-файлов

public class DllLoader {

    private static final String CLASS_NAME = AppletReload.class.getName();

    static String javaHome = System.getProperty("java.io.tmpdir");
    private static String dllPath = javaHome + Constant.SMARTCARD_JACSPCSC_DLL_NAME;
    private static String dllPath1 = javaHome + Constant.SMARTCARD_RXTXSERIAL_DLL_NAME;

    public DllLoader() {
    }

    static {
        try {
            System.load(dllPath);
            Logger.write(LoggerConstant.TRACE, "JACSPCSC Dll loaded from the path: " + dllPath, "Dll Loader");
            System.load(dllPath1);
            Logger.write(LoggerConstant.TRACE, "RXTXSERIAL Dll loaded from the path: " + dllPath1, "Dll Loader");
        } catch (Exception e) {
        // Log exception;
        }
    }
}

И вот как я использую этот загрузчик классов:

cl = new CustomClassLoader();
ca = cl.findClass("com.DllLoader");
a = ca.newInstance();

Мотивация загрузки .dll с помощью пользовательского загрузчика классов заключается в том, что она также гарантирует выгрузку, и это то, что предлагает большинство ответов на вопрос о загрузке / выгрузке .dll.Но в моем случае loadClassData() (функция в моем classLoader) выдает это исключение:

   loadClassData,Error: com\DllLoader.class (The system cannot find the path specified)
    java.io.FileNotFoundException: com\DllLoader.class (The system cannot find the path specified)

, и абсолютный путь к файлу отображается в виде:

** C: \Program Files \ Mozilla Firefox \ com.DllLoader

Я думаю, что именно здесь идет поиск файла, а файл апплета .jar здесь не находится.

Я был бы признателен, если бы кто-нибудь мог указать на мою ошибку или рассказать, как я могу направить браузер для поиска файла класса в правильной папке.

PS: Обратите внимание, что ответ, по-видимому дубликат вопроса не решить эту проблему.

...