@@ -313,6 +313,17 @@ option(CBF_ENABLE_ULP "Enable ULP" OFF)
313313set (CBF_CMAKE_DEBUG "ON" )
314314
315315
316+ #
317+ # Java bindings
318+ #
319+ # The Java module can only be built when BUILD_SHARED_LIBS is set. On
320+ # Debian, Java should only require openjdk-17-jdk-headless but AWT
321+ # requires openjdk-17-jdk?
322+ if (BUILD_SHARED_LIBS )
323+ option (CBF_ENABLE_JAVA "Enable Java" ON )
324+ endif ()
325+
326+
316327#
317328# User setable parameters
318329#
@@ -398,8 +409,6 @@ list(GET _cra 2 _age)
398409math (EXPR SOVERSION "${_current} - ${_age} " )
399410
400411
401- set (JCBF "${CBFlib_SOURCE_DIR} /jcbf" CACHE STRING "" )
402- set (JAVADIR "${CBFlib_SOURCE_DIR} /java" CACHE STRING "" )
403412set (BIN "${CBFlib_BINARY_DIR} /bin" CACHE STRING "" )
404413set (PYCBF "${CBFlib_SOURCE_DIR} /pycbf" CACHE STRING "" )
405414set (EXAMPLES "${CBFlib_SOURCE_DIR} /examples" CACHE STRING "" )
@@ -908,6 +917,76 @@ if(CBF_ENABLE_FORTRAN)
908917endif ()
909918
910919
920+ #
921+ # Java bindings
922+ if (CBF_ENABLE_JAVA)
923+ # In CMake 3.24, COMPONENTS could be set to "JVM" for FindJNI.
924+ find_package (Java COMPONENTS Development REQUIRED)
925+ find_package (JNI REQUIRED)
926+ find_package (SWIG COMPONENTS java REQUIRED)
927+ include (UseJava)
928+ include (UseSWIG)
929+
930+
931+ # Generate ${CMAKE_CURRENT_BINARY_DIR}/jcbf/jcbfJAVA_wrap.c and
932+ # ${_java_files_generated}. Cannot use file(GLOB ...) for
933+ # ${_java_files_generated}, because it would be executed at
934+ # configuration time, when ${CMAKE_CURRENT_BINARY_DIR}/jcbf may not
935+ # exist. get_property(... SWIG_SUPPORT_FILES) only returns
936+ # "jcbf/cbf.java" and "jcbf/cbfJNI.java".
937+ #
938+ # CMake 3.19 and earlier may not automatically regenerate
939+ # ${CMAKE_CURRENT_BINARY_DIR}/jcbf for Makefile Generators unless
940+ # ${CBF__SRC}/jcbf.i is touched.
941+ set_property (SOURCE "${CBF__SRC} /jcbf.i" PROPERTY
942+ INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR} /include" )
943+ set_property (SOURCE "${CBF__SRC} /jcbf.i" PROPERTY
944+ USE_SWIG_DEPENDENCIES TRUE )
945+
946+ swig_add_library(cbf_wrap
947+ LANGUAGE Java
948+ OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR} /jcbf"
949+ SOURCES "${CBF__SRC} /jcbf.i" )
950+ set_property (TARGET cbf_wrap PROPERTY
951+ SWIG_COMPILE_OPTIONS -package org.iucr.cbflib)
952+ target_include_directories (cbf_wrap
953+ PRIVATE "${JAVA_INCLUDE_PATH} "
954+ "${JAVA_INCLUDE_PATH2} " )
955+ target_link_libraries (cbf_wrap
956+ cbf)
957+
958+ set (_java_files_generated
959+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/CBF_NODETYPE.java"
960+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_FILE.java"
961+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_cbf_context.java"
962+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_cbf_file.java"
963+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_double.java"
964+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_int.java"
965+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_long.java"
966+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_p__cbf_handle_struct.java"
967+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_p_cbf_node_struct.java"
968+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_p_char.java"
969+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_size_t.java"
970+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_unsigned_int.java"
971+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/SWIGTYPE_p_void.java"
972+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/cbf.java"
973+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/cbfConstants.java"
974+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/cbfJNI.java"
975+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/cbf_handle_struct.java"
976+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/cbf_node.java"
977+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/doubleP.java"
978+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/intP.java"
979+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/sizetP.java"
980+ "${CMAKE_CURRENT_BINARY_DIR} /jcbf/uintP.java" )
981+
982+ add_jar(cbflib
983+ "${_java_files_generated} "
984+ VERSION "${PROJECT_VERSION} " )
985+ add_dependencies (cbflib
986+ cbf_wrap)
987+ endif ()
988+
989+
911990#
912991# C and C++ examples
913992#
@@ -1068,6 +1147,20 @@ if(CBF_ENABLE_FORTRAN)
10681147endif ()
10691148
10701149
1150+ #
1151+ # Java examples
1152+ if (CBF_ENABLE_JAVA)
1153+ add_executable (ctestcbf
1154+ "${CBF__EXAMPLES} /testcbf.c" )
1155+ target_link_libraries (ctestcbf
1156+ cbf)
1157+
1158+ add_jar(testcbf
1159+ "${CBF__EXAMPLES} /testcbf.java"
1160+ INCLUDE_JARS cbflib)
1161+ endif ()
1162+
1163+
10711164#
10721165# install
10731166#
@@ -2359,3 +2452,45 @@ if(CBF_ENABLE_FORTRAN)
23592452 FIXTURES_REQUIRED fcb_read_image-flatpacked
23602453 REQUIRED_FILES "${data_output} /test_fcb_read_testflatpackedout_orig.out" )
23612454endif ()
2455+
2456+
2457+ #
2458+ # Java tests
2459+ if (CBF_ENABLE_JAVA)
2460+ add_test (NAME java-setup-c
2461+ COMMAND ${CMAKE_COMMAND}
2462+ "-Dcommand=$<TARGET_FILE:ctestcbf>"
2463+ "-Doutput-file=${CBF__DATA} /testcbfc.txt"
2464+ -P "${CMAKE_CURRENT_SOURCE_DIR} /redirect.cmake"
2465+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR} " )
2466+ set_tests_properties (java-setup-c PROPERTIES
2467+ FIXTURES_SETUP java-setup-c
2468+ REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR} /examples/template_pilatus6m_2463x2527.cbf" )
2469+
2470+ add_test (NAME java-cleanup-c
2471+ COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA} /testcbfc.txt" )
2472+ set_tests_properties (java-cleanup-c PROPERTIES
2473+ FIXTURES_CLEANUP java-setup-c)
2474+
2475+ add_test (NAME java-setup-java
2476+ COMMAND ${CMAKE_COMMAND}
2477+ "-Dcommand=${Java_JAVA_EXECUTABLE} ;-Djava.library.path=${CMAKE_BINARY_DIR} /lib/;-cp;$<TARGET_PROPERTY:cbflib,JAR_FILE>:$<TARGET_PROPERTY:testcbf,JAR_FILE>;testcbf"
2478+ "-Doutput-file=${CBF__DATA} /testcbfj.txt"
2479+ -P "${CMAKE_CURRENT_SOURCE_DIR} /redirect.cmake"
2480+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR} " )
2481+ set_tests_properties (java-setup-java PROPERTIES
2482+ FIXTURES_SETUP java-setup-java
2483+ REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR} /examples/template_pilatus6m_2463x2527.cbf" )
2484+
2485+ add_test (NAME java-cleanup-java
2486+ COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA} /testcbfj.txt" )
2487+ set_tests_properties (java-cleanup-java PROPERTIES
2488+ FIXTURES_CLEANUP java-setup-java)
2489+
2490+ add_test (NAME java-cmp
2491+ COMMAND ${CMAKE_COMMAND} -E compare_files
2492+ "${CBF__DATA} /testcbfc.txt"
2493+ "${CBF__DATA} /testcbfj.txt" )
2494+ set_tests_properties (java-cmp PROPERTIES
2495+ FIXTURES_REQUIRED "java-setup-c;java-setup-java" )
2496+ endif ()
0 commit comments