Библиотека C++, динамически связанная с библиотекой Java
Я пишу плагин C++ для приложения. Плагин представляет собой файл.o. Назовите этот код / функциональность как "C".
Я также написал библиотеку Java. Думайте о коде и функциональности как о "J".
Затем я использовал API вызова JNI, чтобы позволить C вызывать J. Теперь C может создавать объекты, вызывать методы, передавать / получать значения из объектов Java или статических методов. Концептуально:
C
JNI method call --------> J
C <----------- Result R
return R
Плагин C вызывает J через JNI. Полезное значение R вычисляется в J, возвращается в C и в конечном итоге возвращается в приложение.
Я индивидуально тестировал коды J, C и JNI с помощью "заглушки", и каждый фрагмент работает сам по себе. R правильно. Проблема в том, что плагин пытается создать виртуальную машину, используя вызовы JNI:
./myPlugin.so: undefined symbol: JNI_CreateJavaVM
Я полагаю, что проблема в том, что мой файл C++ .o хочет динамически связываться с libjvm.so, но либо не знает, как это сделать, либо что-то мешает линковке ld.so во время выполнения.
Когда я запустил JNI как собственный код с заглушкой main (то есть я сделал по сути то же самое, но в качестве приложения с основной функцией, а не с файлом.o) произошло то же самое, но это был явно вопрос ld.so не может найти libjvm.so. Определение:
export LD_LIBRARY_PATH=/usr/java/jdk1.8.0_73/jre/lib/amd64/server
позволил ld.so правильно выполнять свою работу. Однако определение LD_LIBRARY_PATH для включения библиотек Java не работает для моего кода JNI в файле.o.
Отличаются ли правила динамического связывания для библиотек объектных файлов? Стоит ли пытаться статически связать libjvm.so с моим файлом.o? Как можно это сделать?
Я нахожусь на совершенно неизведанной для меня территории и чувствую себя немного потерянным. Любая помощь будет принята с благодарностью!