JNI built in JNI
This commit is contained in:
parent
6e4763e55b
commit
3b3d67a4fe
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
cmake_minimum_required(VERSION 3.10.0)
|
cmake_minimum_required(VERSION 3.10.0)
|
||||||
|
|
||||||
add_library( secp256k1-jni SHARED
|
add_library( secp256k1-jni SHARED
|
||||||
${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/src/org_bitcoin_Secp256k1CFunctions.c
|
${CMAKE_CURRENT_LIST_DIR}/../../../c/src/org_bitcoin_Secp256k1CFunctions.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories( secp256k1-jni
|
target_include_directories( secp256k1-jni
|
||||||
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/secp256k1
|
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/secp256k1
|
||||||
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/headers/java
|
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../c/headers/java
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries( secp256k1-jni
|
target_link_libraries( secp256k1-jni
|
||||||
${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a
|
${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android-${ANDROID_ABI}/libsecp256k1.a
|
||||||
)
|
)
|
||||||
|
@ -2,6 +2,8 @@ plugins {
|
|||||||
kotlin("jvm")
|
kotlin("jvm")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val currentOs = org.gradle.internal.os.OperatingSystem.current()
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
explicitApi()
|
explicitApi()
|
||||||
}
|
}
|
||||||
@ -25,3 +27,46 @@ val generateJniHeaders by tasks.creating(JavaCompile::class) {
|
|||||||
delete(file("${buildDir}/generated/jni-tmp"))
|
delete(file("${buildDir}/generated/jni-tmp"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class Cross {
|
||||||
|
abstract fun cmd(target: String, project: Project): List<String>
|
||||||
|
class DockCross(val cross: String) : Cross() {
|
||||||
|
override fun cmd(target: String, project: Project): List<String> = listOf("${project.rootDir}/cross-scripts/dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target jni/build.sh")
|
||||||
|
}
|
||||||
|
class MultiArch(val crossTriple: String) : Cross() {
|
||||||
|
override fun cmd(target: String, project: Project): List<String> {
|
||||||
|
val uid = Runtime.getRuntime().exec("id -u").inputStream.use { it.reader().readText() }.trim().toInt()
|
||||||
|
return listOf(
|
||||||
|
"docker", "run", "--rm", "-v", "${project.rootDir.absolutePath}:/workdir",
|
||||||
|
"-e", "CROSS_TRIPLE=$crossTriple", "-e", "TARGET=$target", "-e", "TO_UID=$uid", "-e", "CROSS=1",
|
||||||
|
"multiarch/crossbuild", "jni/build.sh"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val buildNativeJni by tasks.creating {
|
||||||
|
group = "build"
|
||||||
|
}
|
||||||
|
fun creatingBuildNativeJni(target: String, cross: Cross?) = tasks.creating(Exec::class) {
|
||||||
|
group = "build"
|
||||||
|
dependsOn(generateJniHeaders)
|
||||||
|
dependsOn(":native:buildSecp256k1${target.capitalize()}")
|
||||||
|
buildNativeJni.dependsOn(this)
|
||||||
|
|
||||||
|
inputs.files(projectDir.resolve("build.sh"))
|
||||||
|
outputs.dir(buildDir.resolve("build/cmake/$target"))
|
||||||
|
|
||||||
|
workingDir = rootDir
|
||||||
|
environment("TARGET", target)
|
||||||
|
commandLine((cross?.cmd(target, project) ?: emptyList()) + "jni/build.sh")
|
||||||
|
}
|
||||||
|
val buildNativeJniDarwin by creatingBuildNativeJni("darwin", if (currentOs.isMacOsX) null else Cross.MultiArch("x86_64-apple-darwin"))
|
||||||
|
val buildNativeJniLinux by creatingBuildNativeJni("linux", if (currentOs.isLinux) null else Cross.DockCross("linux-x64"))
|
||||||
|
val buildNativeJniMingw by creatingBuildNativeJni("mingw", if (currentOs.isWindows) null else Cross.DockCross("windows-x64"))
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
tasks["clean"].doLast {
|
||||||
|
delete(buildDir.resolve("build/cmake"))
|
||||||
|
}
|
||||||
|
}
|
36
jni/build.sh
Executable file
36
jni/build.sh
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
[[ -z "$TARGET" ]] && echo "Please set the TARGET variable" && exit 1
|
||||||
|
|
||||||
|
if [ "$(id -u)" == "0" ]; then
|
||||||
|
[[ -z "$TO_UID" ]] && echo "Please set the TO_UID variable" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
CC=gcc
|
||||||
|
JNI_HEADERS=$TARGET
|
||||||
|
|
||||||
|
if [ "$TARGET" == "linux" ]; then
|
||||||
|
OUTFILE=libsecp256k1-jni.so
|
||||||
|
ADD_LIB=-lgmp
|
||||||
|
elif [ "$TARGET" == "darwin" ]; then
|
||||||
|
OUTFILE=libsecp256k1-jni.dylib
|
||||||
|
if [ -z "$CROSS_TRIPLE" ]; then
|
||||||
|
ADD_LIB=-lgmp
|
||||||
|
fi
|
||||||
|
elif [ "$TARGET" == "mingw" ]; then
|
||||||
|
OUTFILE=secp256k1-jni.dll
|
||||||
|
CC=/usr/src/mxe/usr/bin/x86_64-w64-mingw32.static-gcc
|
||||||
|
JNI_HEADERS=linux
|
||||||
|
CC_OPTS="-fpic"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p build/jni/$TARGET
|
||||||
|
|
||||||
|
$CC -shared $CC_OPTS -o build/jni/$TARGET/$OUTFILE c/src/org_bitcoin_Secp256k1CFunctions.c -Ic/headers/ -Ic/headers/java -Ic/headers/$JNI_HEADERS/ -I../native/secp256k1/ -lsecp256k1 -L../native/build/$TARGET/ $ADD_LIB
|
||||||
|
|
||||||
|
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID .
|
||||||
|
|
||||||
|
echo "Build done for $TARGET"
|
@ -41,5 +41,5 @@ make
|
|||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
mkdir -p build/android/$ARCH
|
mkdir -p build/android-$ARCH
|
||||||
cp -v secp256k1/.libs/libsecp256k1.a build/android/$ARCH
|
cp -v secp256k1/.libs/libsecp256k1.a build/android-$ARCH
|
||||||
|
@ -4,29 +4,23 @@ val currentOs = org.gradle.internal.os.OperatingSystem.current()
|
|||||||
|
|
||||||
val buildSecp256k1 by tasks.creating { group = "build" }
|
val buildSecp256k1 by tasks.creating { group = "build" }
|
||||||
|
|
||||||
val generateJniHeaders by tasks.creating(Sync::class) {
|
|
||||||
group = "build"
|
|
||||||
dependsOn(":jni:generateJniHeaders")
|
|
||||||
from(rootDir.resolve("jni/build/generated/jni"))
|
|
||||||
into(projectDir.resolve("jni/headers/java"))
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class Cross {
|
sealed class Cross {
|
||||||
abstract fun cmd(target: String, nativeDir: File): List<String>
|
abstract fun cmd(target: String, project: Project): List<String>
|
||||||
class DockCross(val cross: String) : Cross() {
|
class DockCross(val cross: String) : Cross() {
|
||||||
override fun cmd(target: String, nativeDir: File): List<String> = listOf("./dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target ./build.sh")
|
override fun cmd(target: String, project: Project): List<String> = listOf("${project.rootDir}/cross-scripts/dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target ./build.sh")
|
||||||
}
|
}
|
||||||
class MultiArch(val crossTriple: String) : Cross() {
|
class MultiArch(val crossTriple: String) : Cross() {
|
||||||
override fun cmd(target: String, nativeDir: File): List<String> {
|
override fun cmd(target: String, project: Project): List<String> {
|
||||||
val uid = Runtime.getRuntime().exec("id -u").inputStream.use { it.reader().readText() }.trim().toInt()
|
val uid = Runtime.getRuntime().exec("id -u").inputStream.use { it.reader().readText() }.trim().toInt()
|
||||||
return listOf(
|
return listOf(
|
||||||
"docker", "run", "--rm", "-v", "${nativeDir.absolutePath}:/workdir",
|
"docker", "run", "--rm", "-v", "${project.projectDir.absolutePath}:/workdir",
|
||||||
"-e", "CROSS_TRIPLE=$crossTriple", "-e", "TARGET=$target", "-e", "TO_UID=$uid", "-e", "CROSS=1",
|
"-e", "CROSS_TRIPLE=$crossTriple", "-e", "TARGET=$target", "-e", "TO_UID=$uid", "-e", "CROSS=1",
|
||||||
"multiarch/crossbuild", "./build.sh"
|
"multiarch/crossbuild", "./build.sh"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val buildSecp256k1Jvm by tasks.creating {
|
val buildSecp256k1Jvm by tasks.creating {
|
||||||
group = "build"
|
group = "build"
|
||||||
buildSecp256k1.dependsOn(this)
|
buildSecp256k1.dependsOn(this)
|
||||||
@ -40,7 +34,7 @@ fun creatingBuildSecp256k1(target: String, cross: Cross?) = tasks.creating(Exec:
|
|||||||
|
|
||||||
workingDir = projectDir
|
workingDir = projectDir
|
||||||
environment("TARGET", target)
|
environment("TARGET", target)
|
||||||
commandLine((cross?.cmd(target, workingDir) ?: emptyList()) + "./build.sh")
|
commandLine((cross?.cmd(target, project) ?: emptyList()) + "./build.sh")
|
||||||
}
|
}
|
||||||
val buildSecp256k1Darwin by creatingBuildSecp256k1("darwin", if (currentOs.isMacOsX) null else Cross.MultiArch("x86_64-apple-darwin"))
|
val buildSecp256k1Darwin by creatingBuildSecp256k1("darwin", if (currentOs.isMacOsX) null else Cross.MultiArch("x86_64-apple-darwin"))
|
||||||
val buildSecp256k1Linux by creatingBuildSecp256k1("linux", if (currentOs.isLinux) null else Cross.DockCross("linux-x64"))
|
val buildSecp256k1Linux by creatingBuildSecp256k1("linux", if (currentOs.isLinux) null else Cross.DockCross("linux-x64"))
|
||||||
|
@ -7,6 +7,8 @@ if [ "$(id -u)" == "0" ]; then
|
|||||||
[[ -z "$TO_UID" ]] && echo "Please set the TO_UID variable" && exit 1
|
[[ -z "$TO_UID" ]] && echo "Please set the TO_UID variable" && exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
cd secp256k1
|
cd secp256k1
|
||||||
|
|
||||||
if [ "$TARGET" == "mingw" ]; then
|
if [ "$TARGET" == "mingw" ]; then
|
||||||
@ -32,26 +34,4 @@ cp -v secp256k1/.libs/libsecp256k1.a build/$TARGET/
|
|||||||
|
|
||||||
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build
|
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build
|
||||||
|
|
||||||
CC=gcc
|
|
||||||
JNI_HEADERS=$TARGET
|
|
||||||
|
|
||||||
if [ "$TARGET" == "linux" ]; then
|
|
||||||
OUTFILE=libsecp256k1-jni.so
|
|
||||||
ADD_LIB=-lgmp
|
|
||||||
elif [ "$TARGET" == "darwin" ]; then
|
|
||||||
OUTFILE=libsecp256k1-jni.dylib
|
|
||||||
if [ -z "$CROSS_TRIPLE" ]; then
|
|
||||||
ADD_LIB=-lgmp
|
|
||||||
fi
|
|
||||||
elif [ "$TARGET" == "mingw" ]; then
|
|
||||||
OUTFILE=secp256k1-jni.dll
|
|
||||||
CC=/usr/src/mxe/usr/bin/x86_64-w64-mingw32.static-gcc
|
|
||||||
JNI_HEADERS=linux
|
|
||||||
CC_OPTS="-fpic"
|
|
||||||
fi
|
|
||||||
|
|
||||||
$CC -shared $CC_OPTS -o build/$TARGET/$OUTFILE jni/src/org_bitcoin_Secp256k1CFunctions.c -Ijni/headers/ -Ijni/headers/java -Ijni/headers/$JNI_HEADERS/ -Isecp256k1/ -lsecp256k1 -Lbuild/$TARGET/ $ADD_LIB
|
|
||||||
|
|
||||||
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build
|
|
||||||
|
|
||||||
echo "Build done for $TARGET"
|
echo "Build done for $TARGET"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user