Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Особенности работы java под Linux


Автор: Andrey1 27.1.2006, 17:21
Есть класс в котором вызывается
Код

System.loadLibrary("lib")
, где lib - nativ(e)ная библиотека.
Под windows класс запускается без вопросов (и библиотеку, скомпилированную gcc, звать 'lib.dll').

Под linux тот же класс не работает, ругается:
Код

Exception in thread "main" java.lang.UnsatisfiedLinkError: no lib in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:992)
        at RPtest.<clinit>(RPtest.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at net.sf.saxon.functions.ExtensionFunctionCall.invokeMethod(ExtensionFunctionCall.java:505)
        at net.sf.saxon.functions.ExtensionFunctionCall.call(ExtensionFunctionCall.java:218)
        at net.sf.saxon.functions.ExtensionFunctionCall.iterate(ExtensionFunctionCall.java:110)
        at net.sf.saxon.expr.CardinalityChecker.iterate(CardinalityChecker.java:137)
        at net.sf.saxon.expr.ExpressionTool.eagerEvaluate(ExpressionTool.java:278)
        at net.sf.saxon.expr.ExpressionTool.lazyEvaluate(ExpressionTool.java:244)
        at net.sf.saxon.expr.LetExpression.eval(LetExpression.java:163)
        at net.sf.saxon.expr.LetExpression.iterate(LetExpression.java:146)
        at net.sf.saxon.expr.IfExpression.iterate(IfExpression.java:225)
        at net.sf.saxon.expr.IfExpression.iterate(IfExpression.java:227)
        at net.sf.saxon.expr.LetExpression.iterate(LetExpression.java:154)
        at net.sf.saxon.expr.ForExpression$MappingAction.map(ForExpression.java:603)
        at net.sf.saxon.expr.MappingIterator.next(MappingIterator.java:61)
        at net.sf.saxon.expr.MappingIterator.next(MappingIterator.java:76)
        at net.sf.saxon.expr.ComputedExpression.process(ComputedExpression.java:567)
        at net.sf.saxon.expr.IfExpression.process(IfExpression.java:238)
        at net.sf.saxon.expr.IfExpression.process(IfExpression.java:240)
        at net.sf.saxon.expr.IfExpression.process(IfExpression.java:240)
        at net.sf.saxon.expr.LetExpression.process(LetExpression.java:202)
        at net.sf.saxon.expr.ForExpression.process(ForExpression.java:535)
        at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:162)
        at net.sf.saxon.instruct.Instruction.process(Instruction.java:90)
        at net.sf.saxon.expr.ForExpression.process(ForExpression.java:535)
        at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:162)
        at net.sf.saxon.instruct.Instruction.process(Instruction.java:90)
        at net.sf.saxon.query.XQueryExpression.run(XQueryExpression.java:311)
        at net.sf.saxon.Query.doMain(Query.java:418)
        at net.sf.saxon.Query.main(Query.java:76)

(1) не в зависимости от того, как звать библиотеку (скомпилированную gcc) 'lib', 'lib.so', "lib.o";
(2) не в зависимости от того указывать, или не указывать, java: -Djava.library.path=. при запуске, относит. путь указывать или абсолют.

Вопрос - почему и что делать?

Автор: powerOn 27.1.2006, 17:38
может прав не хватает? Ты как root запускаешь?

Автор: Andrey1 27.1.2006, 17:58
Цитата(MoonCat @ 27.1.2006, 17:38 Найти цитируемый пост)

может прав не хватает? Ты как root запускаешь?

Да, под рутом. У либы все права на чтение, запуск.

Автор: Andrey1 27.1.2006, 18:40
Каких чудес только не бывает на свете...
Оказывается, либу звать нужно librp.so, а вызывать
Код

System.loadLibrary("rp")

См. http://www.netspade.com/articles/2005/10/23/java-native-interface/
Есть еще энсинуации с LD_LIBRARY_PATH... типа export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ...

Автор: AntonSaburov 27.1.2006, 18:49
Читаем FAQ - http://vingrad.ru/JAVA-JAVA-001971
"Видно, что результатом компиляции должна быть JniTest.dll. Кстати, для Unix-систем должен быть файл вида libJniTest.so. Вот такая особенность. Нужен префикс lib."

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)