diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt --- a/src/secp256k1/CMakeLists.txt +++ b/src/secp256k1/CMakeLists.txt @@ -155,6 +155,27 @@ configure_file(src/libsecp256k1-config.h.cmake.in src/libsecp256k1-config.h ESCAPE_QUOTES) target_compile_definitions(secp256k1 PRIVATE HAVE_CONFIG_H SECP256K1_BUILD) +# Build the Java binding +option(SECP256K1_ENABLE_JNI "Enable the Java Native Interface binding" OFF) +if(SECP256K1_ENABLE_JNI) + if(NOT SECP256K1_ENABLE_MODULE_ECDH) + message(FATAL_ERROR "The secp256k1 JNI support requires ECDH. Try again with -DSECP256K1_ENABLE_MODULE_ECDH=ON.") + endif() + + find_package(Java REQUIRED) + find_package(JNI REQUIRED) + include(UseJava) + + add_library(secp256k1_jni SHARED + src/java/org_bitcoin_NativeSecp256k1.c + src/java/org_bitcoin_Secp256k1Context.c + ) + + target_include_directories(secp256k1_jni PUBLIC ${JNI_INCLUDE_DIRS}) + set_target_properties(secp256k1 PROPERTIES POSITION_INDEPENDENT_CODE ON) + link_secp256k1_internal(secp256k1_jni) +endif() + # Tests option(SECP256K1_BUILD_TEST "Build secp256k1's unit tests" ON) if(SECP256K1_BUILD_TEST) @@ -173,6 +194,45 @@ # This should not be enabled at the same time as coverage is. # TODO: support coverage. target_compile_definitions(exhaustive_tests PRIVATE VERIFY) + + if(SECP256K1_ENABLE_JNI) + set(SECP256k1_JNI_TEST_JAR "secp256k1-jni-test") + + set(CMAKE_JNI_TARGET TRUE) + add_jar(secp256k1-jni-test-jar + SOURCES + src/java/org/bitcoin/NativeSecp256k1.java + src/java/org/bitcoin/NativeSecp256k1Test.java + src/java/org/bitcoin/NativeSecp256k1Util.java + src/java/org/bitcoin/Secp256k1Context.java + ENTRY_POINT org/bitcoin/NativeSecp256k1Test + OUTPUT_NAME "${SECP256k1_JNI_TEST_JAR}" + ) + add_dependencies(secp256k1-jni-test-jar secp256k1_jni) + + set(SECP256K1_JAVA_TEST_COMMAND + "${Java_JAVA_EXECUTABLE}" + "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}" + "-jar" + "${SECP256k1_JNI_TEST_JAR}.jar" + ) + + add_custom_target(secp256k1-check-java + COMMAND + ${SECP256K1_JAVA_TEST_COMMAND} + WORKING_DIRECTORY + "${CMAKE_CURRENT_BINARY_DIR}" + ) + add_dependencies(secp256k1-check-java secp256k1-jni-test-jar) + + add_test(NAME secp256k1-java-test + COMMAND + ${SECP256K1_JAVA_TEST_COMMAND} + WORKING_DIRECTORY + "${CMAKE_CURRENT_BINARY_DIR}" + ) + add_dependencies(check-secp256k1 secp256k1-jni-test-jar) + endif() endif(SECP256K1_BUILD_TEST) # Benchmarks