2016-10-26 3 views
0

Я хочу сделать реализацию Java на основе библиотеки C++ с использованием JNI. К сожалению, когда я хочу использовать общую библиотеку в java, ее не найти. Проблема с этой общей библиотекой заключается в том, что она связывает другую общую библиотеку. У меня два разных случая, когда один работает (но не должен использоваться), а другой - нет.Проблема с загрузкой разделяемой библиотеки в Java

Ana lib всегда должен быть статичным. Clara lib всегда должен делиться. Он работает, когда Bob lib статичен, но он должен быть общим, и он должен включать Ana и Clara.

Корпус 1 (Работает и может быть загружен в правильный java.library.path).

sharedlibJava.so ссылки: staticlibAna.a staticlibBob.a sharedlibClara.so

Случай 2 (Не работает, потому что она не может быть загружена, даже если java.library.path правильно). sharedlibBob.so ссылка: staticlibAna.a и sharedlibClara.so (основной C++ реализация протестирована и работает без проблем)

sharedlibJava.so ссылки: sharedlibBob.so (реализация Java должна быть доступна с помощью этой новой общей библиотеки).

Проблема в том, что когда я пытаюсь загрузить библиотеку, она даже не находит ее в правильном java.library.path, даже если она находится там.

Я был бы очень признателен за любые отзывы по этой проблеме.

ответ

0

Поместите все ваши пути на LD_LIBRARY_PATH. Альтернативно, поместите их в -Djava.library.path

Если вы правильно скомпилировали код, я не думаю, что при доступе к общей библиотеке вы должны испытывать проблемы.

Если вы собираете один код, общий Lib, а затем ссылаться на него, связывая другой код с общей Lib, он должен работать нормально

cc -g -shared -fpic c/recipeNo023_AnotherFunction.c -o lib/libAnotherFunction.$(EXT) 
cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(ARCH) c/recipeNo023_HelloWorld.c -L./lib -lAnotherFunction -o lib/libHelloWorld.$(EXT) 

Затем, вы должны быть в состоянии назвать код пропускания Lib расположение внутри -Djava.library.path

java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld 
library: :./lib 
Hello world! 
Hello from another function! 

Для полного примера кода, посмотрите здесь:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo023

Смежные вопросы