Здравствуйте. Помогите пожалуйста разобраться. Есть DLL'ка, которую надо вызвать из Java. Создал обвёртку, проверил на тестовом консольном Java-приложении, всё работает. При подключении её в реальный проект (веб-приложение) на строке вызова функции летит exception : java.lang.UnsatisfiedLinkError: RemotePrepareToSearch
RemotePrepareToSearch — это експортируемая функция:
public native int RemotePrepareToSearch(String ip, int port, String fileName);
static
{
System.loadLibrary( "jmi_inspector" );
}
Есть подозрение что как-то не находятся нужные пути. Для консольного приложения
System.getProperty("user.dir")
выдаёт путь в котром находиться скомпиленый class файл. Для веб приложения эта же инструкция выдаёт путь
c:\Tomcat5\bin
помещал все дллки во все пути , не помагает. Кстати реальная дллка, которую вызывает длл-обвёртка, для себя грузит ещё 18 других дллок. Попробовал создать отдельнуб папку, поместил туда все нужные дллки, и прописал эту папку в переменной окружения PATH ... не работает.
Здравствуйте, GROWER, Вы писали:
GRO>Здравствуйте. Помогите пожалуйста разобраться. Есть DLL'ка, которую надо вызвать из Java. Создал обвёртку, проверил на тестовом консольном Java-приложении, всё работает. При подключении её в реальный проект (веб-приложение) на строке вызова функции летит exception : java.lang.UnsatisfiedLinkError: RemotePrepareToSearch GRO>RemotePrepareToSearch — это експортируемая функция: GRO>
GRO>public native int RemotePrepareToSearch(String ip, int port, String fileName);
GRO>static
GRO>{
GRO> System.loadLibrary( "jmi_inspector" );
GRO>}
GRO>
GRO>Есть подозрение что как-то не находятся нужные пути. Для консольного приложения GRO>
GRO>System.getProperty("user.dir")
GRO>
user.dir к загрузке dll в java отношения не имеет
Можно попробовать указать в System.loadLibrary полный путь к dll-е (с расширением).
Если ОС — M$, то стоит почитать msdn про LoadLibrary — там подробно описана логика того где либы ищутся.
Здравствуйте, GROWER, Вы писали:
GRO>Здравствуйте. Помогите пожалуйста разобраться. Есть DLL'ка, которую надо вызвать из Java. Создал обвёртку, проверил на тестовом консольном Java-приложении, всё работает. При подключении её в реальный проект (веб-приложение) на строке вызова функции летит exception : java.lang.UnsatisfiedLinkError: RemotePrepareToSearch GRO>RemotePrepareToSearch — это експортируемая функция: GRO>
GRO>public native int RemotePrepareToSearch(String ip, int port, String fileName);
GRO>static
GRO>{
GRO> System.loadLibrary( "jmi_inspector" );
GRO>}
GRO>
GRO>Есть подозрение что как-то не находятся нужные пути. Для консольного приложения GRO>
GRO>System.getProperty("user.dir")
GRO>
GRO>выдаёт путь в котром находиться скомпиленый class файл. Для веб приложения эта же инструкция выдаёт путь GRO>c:\Tomcat5\bin GRO>помещал все дллки во все пути , не помагает. Кстати реальная дллка, которую вызывает длл-обвёртка, для себя грузит ещё 18 других дллок. Попробовал создать отдельнуб папку, поместил туда все нужные дллки, и прописал эту папку в переменной окружения PATH ... не работает.
1. Смотри проперти не user.dir, а java.library.path
2. Класс с нативными методами должен загружаться не webapp класслоадером, а каким-то корневым. Т.е. быть не в WEB-INF/classes или WEB-INF/lib/*, в где-то вроде $CATALINA_HOME/shared/...
3. Желательно иметь версию java, точное сообщение об ошибке и, возможно, версию web контейнера.
D>1. Смотри проперти не user.dir, а java.library.path D>2. Класс с нативными методами должен загружаться не webapp класслоадером, а каким-то корневым. Т.е. быть не в WEB-INF/classes или WEB-INF/lib/*, в где-то вроде $CATALINA_HOME/shared/... D>3. Желательно иметь версию java, точное сообщение об ошибке и, возможно, версию web контейнера.
Прописал путь к дллкам в java.library.path, выложил их в shared\lib , положил скомпиленый класс, который использует native — методы в shared\classes , создал файл workers.properties в пути C:\Tomcat_5\conf с таким содержимым :
GRO>Прописал путь к дллкам в java.library.path
Как именно?
По-хорошему, надо это прописывать до старта Java (в коммандной строке), так как корневой ClassLoader разбирает эту property однажды, и сохраняет в своей переменной.
Либо, делать так:
System.setProperty("java.library.path", newLibPath);
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
if (fieldSysPath != null) {
fieldSysPath.set(System.class.getClassLoader(), null);
}
Как выглядит название нативного метода в C коде (т.е. то, что получается на выходе javah)? У меня есть подозрение, что поменялось имя класса, метода или пакета, а хеадеры не были перегенерины (или были перегенерины неправильно).
Здравствуйте, GROWER, Вы писали:
GRO>положил скомпиленый класс, который использует native — методы в shared\classes ,
Там должен быть класс, который имеет нативные методы. Мы правильно друг друга поняли?
GRO>создал файл workers.properties в пути C:\Tomcat_5\conf с таким содержимым : GRO>
D>Как выглядит название нативного метода в C коде (т.е. то, что получается на выходе javah)? У меня есть подозрение, что поменялось имя класса, метода или пакета, а хеадеры не были перегенерины (или были перегенерины неправильно).
Супер ! Большое спасибо, дело было именно в этом. Перегенерил H-файл и заработало.