Нативные библиотеки и Java Web Start
От: dshe  
Дата: 20.04.04 06:57
Оценка:
Привет всем,

Есть некая нативная 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 находилась и загружалась, и могла быть использована?
--
Дмитро
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.