Связывание Java Invocation API в Windows с CMAKE

#java #c #cmake #java-native-interface

#java #c #cmake #java-родной интерфейс

Вопрос:

Я пытаюсь ознакомиться с C / CMake и компоновкой в Windows, запустив JVM с Java Invocation API. К сожалению, у меня возникли некоторые проблемы с пониманием того, как работает связывание в Windows. Я использую CLion с установленной Visual Studio 2019.

У меня установлен OpenJDK 13, на C:/dev/Java/jdk-13.0.2 который указывает мой JAVA_HOME .

Мой CMakeLists.txt является:

 cmake_minimum_required(VERSION 3.16)
project(cppjni)

set(CMAKE_CXX_STANDARD 17)

find_package(JNI REQUIRED)

message("jni libraries ${JNI_LIBRARIES}")
add_executable(cppjni main.cpp MyJvm.cpp MyJvm.h)
target_include_directories(cppjni PUBLIC ${JNI_INCLUDE_DIRS})
target_link_libraries(cppjni ${JNI_LIBRARIES})
  

Класс MyJVM — это просто оболочка интерфейса JNI, как указано в руководстве поhttps://docs.oracle.com/javase/10/docs/specs/jni/invocation.html.

К сожалению, всякий раз, когда я запускаю это в Clion, я получаю

 C:devWorkspacecppjnicmake-build-debugcppjni.exe

Process finished with exit code -1073741515 (0xC0000135)
  

Я думаю, что это связано с тем, что связывание работает некорректно. Если я установлю рабочий каталог в
C:devJavajdk-13.0.2binserver , приложение запускается.

Скрипт FindJNI выводит это, если я запускаю cmake вручную в Powershell:

 -- Found JNI: C:/dev/Java/jdk-13.0.2/lib/jawt.lib
jni libraries C:/dev/Java/jdk-13.0.2/lib/jawt.lib;C:/dev/Java/jdk-13.0.2/lib/jvm.lib
  

Насколько я понимаю, это статические библиотеки JVM. Затем они должны быть включены в окончательный двоичный файл, верно? Или я должен отправить jvm.dll с моим приложением, когда я его запускаю?

Кроме того, jvm.dll имеет размер около 12 Мб, но jvm.lib составляет всего 977 кб. Это не может быть одна и та же JVM, верно? Но почему FindJNI не находит jvm.dll ?

Спасибо!

Комментарии:

1. «Насколько я понимаю, это статические библиотеки JVM». — Нет, .lib файл может обозначать файл импорта , соответствующий динамической библиотеке ( .dll ). Согласно полученному вами коду ошибки, это на самом деле ваш случай.