Ответ 1
Этот пост старый, но сегодня у меня была такая же проблема, и я нашел хорошее решение.
В моем текущем подходе различаются время сборки buildsystem и время сборки. Вместо использования подстановочных знаков (что, похоже, не работает с add_jar на окнах). Я использую add_custom_command() для создания JAR с сгенерированными классами Java в время сборки. Я знаю имя этого JAR в время сборки buildsystem. И поэтому я могу использовать это имя как параметр INCLUDE_JAR для функции add_jar(). Я буду ссылаться на JAR, содержащий java файлы, созданные SWIG как Native.jar.
Вот пример того, как вы можете достичь CMake + Java + SWIG
Сначала нам нужно найти необходимые пакеты:
FIND_PACKAGE(SWIG REQUIRED)
FIND_PACKAGE(JNI REQUIRED)
FIND_PACKAGE(Java REQUIRED)
INCLUDE(UseSWIG)
INCLUDE(UseJava)
Затем нам нужно определить наш SWIG-модуль:
SET(CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/java")
SET_PROPERTY(SOURCE "native-interface.i" PROPERTY CPLUSPLUS ON)
SWIG_ADD_MODULE(Native java "native-interface.i"
"algorithm.hpp"
"algorithm-listener.hpp"
"simple-methods.hpp" "simple-methods.cpp"
)
TARGET_INCLUDE_DIRECTORIES(Native
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${JAVA_INCLUDE_PATH}
PRIVATE ${JAVA_INCLUDE_PATH2})
Как вы можете видеть, я использую подкаталог java для хранения java файлов. Я также добавлю подкаталог для файлов классов, а затем зарегистрирую POST_BUILD Events для создания Native.jar:
FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/classes")
ADD_CUSTOM_COMMAND(TARGET Native POST_BUILD
COMMAND "${Java_JAVAC_EXECUTABLE}" -d classes java/*.java
COMMAND "${Java_JAR_EXECUTABLE}" -cfM Native.jar -C classes .
)
# Store Path to native JAR in variable:
SET(NATIVE_JAR "${CMAKE_CURRENT_BINARY_DIR}/Native.jar")
В следующем шаге мы создадим проект java с использованием функции add_jar():
ADD_JAR(ConsoleApp
SOURCES "NativeInvoker.java"
INCLUDE_JARS ${NATIVE_JAR})
SET(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
Если вы используете другую папку для своего проекта (например, родной в одном подкаталоге и Java-материале в другом). Вы должны скопировать файл Native.dll в ту же папку, что и ваше java-приложение, или убедиться, что она найдена Java. Чтобы сделать это в CMake, вы можете снова использовать add_custom_command().
ADD_CUSTOM_COMMAND(TARGET ConsoleApp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Native> ${CMAKE_CURRENT_BINARY_DIR})
Надеюсь, это поможет многим из вас, ребята.
Приветствия Tim