Связывание C с JNI, независимо от версии JDK
Я вызываю Java-приложение внутри моей C-программы через JNI.
Установив JDK 1.8, у меня есть следующий JNI .so
библиотеки в моей системе:
/usr/java/jdk1.8.0_51/jre/lib/amd64/jli/libjli.so
/usr/java/jdk1.8.0_51/jre/lib/amd64/server/libjvm.so
Чтобы эти два файла были известны ldconfig
Я могу создать ссылки на них в /usr/lib64/
или создать /etc/ld.so.conf.d/java.conf
файл, который перечисляет их.
Это позволяет мне скомпилировать мой код на C следующим образом:
gcc -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ \
-L/usr/java/jdk1.8.0_51/jre/lib/amd64/jli \
-L/usr/java/jdk1.8.0_51/jre/lib/amd64/server/ \
callSomeJava.c -ljvm -ljli
Это похоже на взлом системы, а не на надежный способ разработки и развертывания кода JNI. JDK не считает, что выставил этих библиотек в ОС способом, который поощряет их доверие.
Мои вопросы следующие:
- Почему JDK содержит
linker name
(lib.so), а неreal name
(lib.so.NN) этих библиотек? 3.1.1. Имена общих библиотек - Откуда мне взять необходимые библиотеки, чтобы они уже были установлены по ссылке без моих системных хаков?
- Как я могу скомпилировать / развернуть мой C таким способом, который:
- не зависит от меня, вручную поддерживая
ldconfig
когда я обновляю свой JDK? - позволяет в результате
a.out
чтобы найти библиотек в средах развертывания, которые не имели моегоldconfig
хаки?
- не зависит от меня, вручную поддерживая