Как связать программу C++ с jvm (виртуальная машина Java)?

Я пытаюсь следовать этому учебному руководству, которое создает JVM из программы C++. Компиляции программы, но когда это выполняет его, перестали работать с

error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

Программа (это - прямая копия со связанного учебного руководства):

#include 
#include 


using namespace std;
int main()
{
   JavaVM *jvm;                      // Pointer to the JVM (Java Virtual Machine)
   JNIEnv *env;                      // Pointer to native interface
       //================== prepare loading of Java VM ============================
   JavaVMInitArgs vm_args;                        // Initialization arguments
   JavaVMOption* options = new JavaVMOption[1];   // JVM invocation options
   options[0].optionString = "-Djava.class.path=.";   // where to find java .class
   vm_args.version = JNI_VERSION_1_6;             // minimum Java version
   vm_args.nOptions = 1;                          // number of options
   vm_args.options
   = options;
   vm_args.ignoreUnrecognized = false;     // invalid options make the JVM init fail
       //=============== load and initialize Java VM and JNI interface =============
   jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  // YES !!
   delete options;    // we then no longer need the initialisation options.
   if (rc != JNI_OK) {
          // TO DO: error processing...
         std::cin.get();
         exit(EXIT_FAILURE);
   }
      //=============== Display JVM version =======================================
   cout << "JVM load succeeded: Version ";
   jint ver = env->GetVersion();
   cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl;

   // TO DO: add the code that will use JVM <============  (see next steps)

   jvm->DestroyJavaVM();
   cin.get();
}

Make-файл:

CC=g++
CFLAGS=-c -Wall 
SOURCES= main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=searchEngineCpp
PROG_PATH = /

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $@ -L/usr/bin/java -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm

.cpp.o:
   $(CC) $(CFLAGS) $< -o $@ -g -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux

clean:
   rm -rf *.o searchEngineCpp

Я попытался установить LD_LIBRARY_PATH с

export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-oracle/lib/amd64:/usr/lib/jvm/java-7-oracle/lib/amd64/server

Я видел несколько сообщений, которые рекомендовали удостовериться, что переменная JAVA_HOME указывала; я удостоверился, что это указало на вышеупомянутую папку.

Были также другие сообщения, которые рекомендовали работать sudo R CMD javareconf

Переменная JAVA_HOME там была /usr/lib/jvm/default-java.Что мне делать?

1
задан 8 March 2020 в 02:28

1 ответ

Необходимо смочь использовать LD_LIBRARY_PATH, однако, несомненно, необходимо будет использовать тот же путь, как Вы дали в команде компоновщика Make-файла, т.е.

LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server

(FWIW Вам не нужно -L/usr/bin/java в команде компоновщика.)

Можно проверить, что путь является корректным использованием ldd напр.

LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ldd ./searchEngineCpp

Для более постоянного решения Вы могли добавить файл к /etc/ld.so.conf.d/ каталог, и затем выполненный ldconfig обновить динамический кэш компоновщика. Имя не важно, пока это значимо для Вас. Например:

echo '/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server' | 
  sudo tee -a /etc/ld.so.conf.d/java-8-openjdk-amd64.conf

sudo ldconfig
1
ответ дан 8 March 2020 в 23:45

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

Похожие вопросы: