Библиотека 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? Как можно это сделать?

Я нахожусь на совершенно неизведанной для меня территории и чувствую себя немного потерянным. Любая помощь будет принята с благодарностью!

0 ответов

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