#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
). Согласно полученному вами коду ошибки, это на самом деле ваш случай.