Связывание 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 хаки?

0 ответов

Другие вопросы по тегам