Подтвердить что ты не робот

Каков правильный способ использования add_jar с привязками Java, созданных Swig?

Я использую Swig для создания привязки Java для библиотеки C. Система сборки написана в CMake, чтобы обеспечить нейтральность платформы. Я хочу создать JAR файл, содержащий привязки Java (т.е. Файлы .class, полученные в результате компиляции .java файлов, созданных Swig). Я пытаюсь использовать команду Cmake add_jar() для выполнения компиляции и создания файла JAR.

Моя проблема в том, что Swig создает набор файлов Java во время сборки, но add_jar() требуется список исходных файлов во время выполнения cmake. В настоящее время я работаю над проблемой, используя подстановочный шаблон UNIX (который передается буквально в командную строку javac).

# How do I avoid the shell wildcard?
add_jar(ExampleJNI ${CMAKE_SWIG_OUTDIR}/*.java)

Есть ли лучший способ?

Ниже приведен полный пример (содержащий три файла), который иллюстрирует мой подход. Если вы хотите попробовать сами, поместите эти три файла в каталог, затем вызовите cmake . ; make VERBOSE=1.

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
find_package(Swig REQUIRED)
find_package(Java REQUIRED)
find_package(JNI REQUIRED)
include(UseJava)
include(UseSWIG)

project (Example)

add_library (Example example.c)

set(CMAKE_SWIG_FLAGS -package org.mycompany)
set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/src/main/java/org/mycompany)

swig_add_module(ExampleSWIG java example.i)
include_directories(${JNI_INCLUDE_DIRS})

swig_link_libraries(ExampleSWIG Example)

# How do I avoid the wildcard?
add_jar(ExampleJNI ${CMAKE_SWIG_OUTDIR}/*.java)

add_dependencies(ExampleJNI ExampleSWIG)

example.c

int foo() {
  return 0;
}

example.i

%module example

%inline %{
    extern int    foo();
%}

Я использую:

  • cmake версия 2.8.10.2
  • Версия Java "1.6.0_37"
  • Версия SWIG 2.0.9
  • Mac OS X Darwin Kernel Версия 12.2.0
4b9b3361

Ответ 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

Ответ 2

Вы можете попытаться использовать globing файлов:

FILE(GLOB SWIG_JAVA_FILES ${CMAKE_SWIG_OUTDIR}/*.java)
add_jar(ExampleJNI ${SWIG_JAVA_FILES})