JNI + UnsatisfiedLinkError
От: GROWER  
Дата: 18.02.08 16:44
Оценка:
Здравствуйте. Помогите пожалуйста разобраться. Есть 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 ... не работает.
Re: JNI + UnsatisfiedLinkError
От: alsemm Россия  
Дата: 18.02.08 17:26
Оценка:
Здравствуйте, 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 — там подробно описана логика того где либы ищутся.

Алексей
Re: JNI + UnsatisfiedLinkError
От: dshe  
Дата: 19.02.08 08:52
Оценка:
Здравствуйте, 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 контейнера.
--
Дмитро
Re[2]: JNI + UnsatisfiedLinkError
От: GROWER  
Дата: 19.02.08 11:15
Оценка:
D>1. Смотри проперти не user.dir, а java.library.path
D>2. Класс с нативными методами должен загружаться не webapp класслоадером, а каким-то корневым. Т.е. быть не в WEB-INF/classes или WEB-INF/lib/*, в где-то вроде $CATALINA_HOME/shared/...
D>3. Желательно иметь версию java, точное сообщение об ошибке и, возможно, версию web контейнера.

Java 1.5 , Apache Tomcat/5.5.16 , ошибка :
java.lang.UnsatisfiedLinkError: RemotePrepareToSearch
    ua.gov.arcanum.util.UploadManager.RemotePrepareToSearch(Native Method)
    ua.gov.arcanum.util.UploadManager.doPost(UploadManager.java:86)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        ............................................................

Прописал путь к дллкам в java.library.path, выложил их в shared\lib , положил скомпиленый класс, который использует native — методы в shared\classes , создал файл workers.properties в пути C:\Tomcat_5\conf с таким содержимым :
worker.fast.type=jni
worker.localjni.ld_path=E:\Projects\Finger

ничего из всего этого не помогает.
Re[3]: JNI + UnsatisfiedLinkError
От: DK3981 Россия  
Дата: 19.02.08 12:20
Оценка:
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);
    }

(собственно, код взят из исходников JDIC'а).
... << RSDN@Home 1.2.0 alpha rev. 728>>
Re[3]: JNI + UnsatisfiedLinkError
От: dshe  
Дата: 19.02.08 15:09
Оценка: 3 (1)
Здравствуйте, GROWER, Вы писали:

GRO>Java 1.5 , Apache Tomcat/5.5.16 , ошибка :

GRO>
GRO>java.lang.UnsatisfiedLinkError: RemotePrepareToSearch
GRO>    ua.gov.arcanum.util.UploadManager.RemotePrepareToSearch(Native Method)
GRO>    ua.gov.arcanum.util.UploadManager.doPost(UploadManager.java:86)
GRO>    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
GRO>        ............................................................
GRO>


Как выглядит название нативного метода в C коде (т.е. то, что получается на выходе javah)? У меня есть подозрение, что поменялось имя класса, метода или пакета, а хеадеры не были перегенерины (или были перегенерины неправильно).
--
Дмитро
Re[3]: JNI + UnsatisfiedLinkError
От: dshe  
Дата: 19.02.08 15:19
Оценка:
Здравствуйте, GROWER, Вы писали:

GRO>положил скомпиленый класс, который использует native — методы в shared\classes ,


Там должен быть класс, который имеет нативные методы. Мы правильно друг друга поняли?

GRO>создал файл workers.properties в пути C:\Tomcat_5\conf с таким содержимым :

GRO>
GRO>worker.fast.type=jni
GRO>worker.localjni.ld_path=E:\Projects\Finger
GRO>


зачем это?
--
Дмитро
Re[4]: JNI + UnsatisfiedLinkError
От: GROWER  
Дата: 19.02.08 16:49
Оценка:
GRO>>создал файл workers.properties в пути C:\Tomcat_5\conf с таким содержимым :
GRO>>
GRO>>worker.fast.type=jni
GRO>>worker.localjni.ld_path=E:\Projects\Finger
GRO>>


D>зачем это?


Зачем это тольком не знаю, нашёл на здесь ,
попробовал на всякий случай.
Re[4]: JNI + UnsatisfiedLinkError
От: GROWER  
Дата: 19.02.08 16:52
Оценка:
D>Как выглядит название нативного метода в C коде (т.е. то, что получается на выходе javah)? У меня есть подозрение, что поменялось имя класса, метода или пакета, а хеадеры не были перегенерины (или были перегенерины неправильно).

Супер ! Большое спасибо, дело было именно в этом. Перегенерил H-файл и заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.