Для устранения .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: Обратите внимание, что ответ, по-видимому дубликат вопроса не решить эту проблему.