Привет всем,
Есть некая нативная dll'ка, которая содержит функциональность, которая должна использоваться в Java приложении, но по некоторым соображениям ее нельзя переписать на Java. Назовем ее native.dll. Эта библиотека успешно используется в существующих C/C++ приложениях, но она ничего не знает о том, что она будет использоваться в Java приложении, т.е. она не экспортирует имена в удобном для Java виде. Предположим, она экспортирует функцию под именем DoSomething.
Для того, чтобы использовать native.dll, написан класс (с нативной реализацией в библиотеке adapter.dll)
package com.comp.adapter;
public class Adapter {
static {
System.loadLibrary("adapter");
}
public native void doSomething();
}
с приблизительно такой реализацией
// adapter.dll: adapter.cpp
JNIEXPORT void JNICALL Java_com_comp_adapter_Adapter_doSomething
(JNIEnv *env, jobject)
{
HINSTANCE hLibrary = LoadLibrary(_T("native.dll"));
void (*func)() = (void (*)()) GetProcAddress(hLibrary, _T("DoSomething"));
func();
FreeLibrary(hLibrary);
}
Это все дело работает, если запускается Java приложение, в текущей директории которого присутствуют обе библиотеки (native.dll и adapter.dll).
Это Java приложение деплоится через Java Web Start. Для этого обе нативные либы, упаковываются в native.jar, этот .jar подписывается и прописывается ссылка на него в .jnlp файл приложения.
Однако через Java Web Start это приложение не работает. В тот момент, когда приложение запускается, загружается (успешно) adapter.dll, выполняется вызов doSomething, пытается загрузиться библиотека native.dll, и она не находится. Почему не находится, в общем-то понятно -- вызов LoadLibrary ищет ее по "своим" местам: в директории экзешника (в данном случае %JRE_HOME%/bin), в текущей (десктоп текущего пользователя), в системной (C:\Windows\System32), в windows (C:\Windows), в директориях, указанных в %PATH%, но не там, куда ее скачал JWS.
Вопрос заключается в следующем: как сделать так, что бы native.dll находилась и загружалась, и могла быть использована?