From 7af7b7760e65d3320918c86ea11f9459ffa5116a Mon Sep 17 00:00:00 2001 From: Fabrice Drouin Date: Mon, 4 Apr 2022 11:26:18 +0200 Subject: [PATCH] Document how to add custom JNI bindings (#50) This is how we add Linux Arm64 JNI bindings. --- publishing/PUBLISHING.md | 19 +++++++++++++++++++ publishing/secp256k1-kmp-add-linuxarm64.sh | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100755 publishing/secp256k1-kmp-add-linuxarm64.sh diff --git a/publishing/PUBLISHING.md b/publishing/PUBLISHING.md index 15f161e..d2588be 100644 --- a/publishing/PUBLISHING.md +++ b/publishing/PUBLISHING.md @@ -7,6 +7,7 @@ To publish snapshot, you must add your sonatype credentials for the `ossrh` serv - Download `snapshot.zip` generated by the `Publish snapshot` github action - unzip `snapshot.zip` in the `publishing` directory +- add additional JNI bindings (optional, see below) - edit `secp256k1-kmp-snapshot-deploy.sh` and update the `VERSION` environment variable if needed - run `secp256k1-kmp-snapshot-deploy.sh` @@ -17,7 +18,25 @@ You must edit `secp256k1-kmp-staging-upload.sh` and add your sonatype credential - Download `release.zip` generated by the `Publish release` github action (which is triggered every time you publish a github release) - unzip `release.zip` in the `publishing` directory +- add additional JNI bindings (optional, see below) - edit `secp256k1-kmp-staging-upload.sh` and update the `VERSION` environment variable if needed - sign all artifacts with a valid gpg key: `find release -type f -print -exec gpg -ab {} \;` - run `secp256k1-kmp-staging-upload.sh` - log into sonatype, close and publish your staging repository. Artifacts will be available on Maven Central within a few hours. + +## Adding custom JNI bindings + +Github CI currently generates JNI bindings for Windows x64, Linux x64 and iOS x64. But it is possible to add custom bindings to JNI packages before +they are published to maven central. This is how we add linux arm64 bindings: +- compile JNI bindings for Linux Arm64 (on a Linux Arm64 machine, cross-compilation is not supported) + - git clone --recursive https://github.com/ACINQ/secp256k1-kmp.git + - cd secp256k1-kmp + - TARGET=linux ./native/build.sh + - mkdir -p jni/jvm/build/linux + - TARGET=linux ./jni/jvm/build.sh + - JNI library is: jni/jvm/build/linux/libsecp256k1-jni.so +- copy libsecp256k1-jni.so to fr/acinq/secp256k1/jni/native/linux-aarch64/libsecp256k1-jni.so +- run `secp256k1-kmp-add-linuxarm64.sh` and specify either `release` or `snapshot` and the `VERSION` environment variable, for example: + - VERSION=0.6.4-SNAPSHOT ./secp256k1-kmp-add-linuxarm64.sh snapshot + - VERSION=0.6.3 ./secp256k1-kmp-add-linuxarm64.sh release + diff --git a/publishing/secp256k1-kmp-add-linuxarm64.sh b/publishing/secp256k1-kmp-add-linuxarm64.sh new file mode 100755 index 0000000..e79cfeb --- /dev/null +++ b/publishing/secp256k1-kmp-add-linuxarm64.sh @@ -0,0 +1,17 @@ +#!/bin/bash -x + +if [ $# -eq 0 ] + then + echo "specify either snapshot or release" + exit 1 +fi + +# add aarch64 (ARM64) library to the linux jar +if [ -e fr/acinq/secp256k1/jni/native/linux-aarch64/libsecp256k1-jni.so ] +then + jar -uf $1/fr/acinq/secp256k1/secp256k1-kmp-jni-jvm-linux/$VERSION/secp256k1-kmp-jni-jvm-linux-$VERSION.jar fr || exit +else + libsecp256k1-jni.so for arch64 is missing + exit 1 +fi +