Using javac to generate header

This commit is contained in:
Salomon BRYS 2020-07-01 13:53:26 +02:00
parent 720637ec24
commit 6e4763e55b
24 changed files with 358 additions and 385 deletions

View File

@ -51,7 +51,7 @@ kotlin {
implementation(kotlin("stdlib-jdk8")) implementation(kotlin("stdlib-jdk8"))
} }
compilations["test"].dependencies { compilations["test"].dependencies {
implementation(project(":jni")) implementation(project(":jni:jvm"))
implementation(kotlin("stdlib-jdk8")) implementation(kotlin("stdlib-jdk8"))
implementation(kotlin("test-junit")) implementation(kotlin("test-junit"))
} }

View File

@ -0,0 +1,48 @@
plugins {
id("com.android.library")
kotlin("android")
}
kotlin {
explicitApi()
}
dependencies {
api(project(":jni"))
implementation(kotlin("stdlib-jdk8"))
}
android {
defaultConfig {
compileSdkVersion(30)
minSdkVersion(21)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
externalNativeBuild {
cmake {
setPath("src/main/CMakeLists.txt")
}
}
ndkVersion = "21.3.6528147"
afterEvaluate {
tasks.withType<com.android.build.gradle.tasks.factory.AndroidUnitTest>().all {
enabled = false
}
}
}
afterEvaluate {
configure(listOf("Debug", "Release").map { tasks["externalNativeBuild$it"] }) {
dependsOn(":native:buildSecp256k1Android")
}
}

View File

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest package="fr.acinq.secp256k1"> <manifest package="fr.acinq.secp256k1.jni">
</manifest> </manifest>

View File

@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 3.10.0)
add_library( secp256k1-jni SHARED
${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/src/org_bitcoin_Secp256k1CFunctions.c
)
target_include_directories( secp256k1-jni
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/secp256k1
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/headers/java
)
target_link_libraries( secp256k1-jni
${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a
)

View File

@ -3,12 +3,12 @@ package fr.acinq.secp256k1.jni
import fr.acinq.secp256k1.Secp256k1 import fr.acinq.secp256k1.Secp256k1
import org.bitcoin.NativeSecp256k1 import org.bitcoin.NativeSecp256k1
public actual object NativeSecp256k1Loader { public object NativeSecp256k1Loader {
@JvmStatic @JvmStatic
@Synchronized @Synchronized
@Throws(Exception::class) @Throws(Exception::class)
actual fun load(): Secp256k1 { fun load(): Secp256k1 {
System.loadLibrary("secp256k1-jni") System.loadLibrary("secp256k1-jni")
return NativeSecp256k1 return NativeSecp256k1
} }

View File

@ -1,104 +1,27 @@
plugins { plugins {
kotlin("multiplatform") // version "1.4-M2-mt" kotlin("jvm")
id("com.android.library")
`maven-publish`
} }
val currentOs = org.gradle.internal.os.OperatingSystem.current()
kotlin { kotlin {
explicitApi() explicitApi()
val commonMain by sourceSets.getting {
dependencies {
api(rootProject)
implementation(kotlin("stdlib-common"))
}
}
val commonTest by sourceSets.getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
jvm {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
(tasks[compilations["main"].processResourcesTaskName] as ProcessResources).apply {
dependsOn("copyJni")
from(buildDir.resolve("jniResources"))
}
compilations["main"].dependencies {
implementation(kotlin("stdlib-jdk8"))
}
compilations["test"].dependencies {
implementation(kotlin("test-junit"))
}
}
android {
publishLibraryVariants("release", "debug")
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
sourceSets["androidMain"].dependencies {
implementation(kotlin("stdlib-jdk8"))
}
sourceSets["androidTest"].dependencies {
implementation(kotlin("test-junit"))
implementation("androidx.test.ext:junit:1.1.1")
implementation("androidx.test.espresso:espresso-core:3.2.0")
}
}
sourceSets.all {
languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn")
}
} }
android { dependencies {
defaultConfig { api(rootProject)
compileSdkVersion(30) implementation(kotlin("stdlib-jdk8"))
minSdkVersion(21)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
externalNativeBuild {
cmake {
setPath("src/androidMain/CMakeLists.txt")
}
}
ndkVersion = "21.3.6528147"
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
afterEvaluate {
tasks.withType<com.android.build.gradle.tasks.factory.AndroidUnitTest>().all {
enabled = false
}
}
} }
val copyJni by tasks.creating(Sync::class) { val generateJniHeaders by tasks.creating(JavaCompile::class) {
dependsOn(":native:buildSecp256k1Jvm") group = "build"
from(rootDir.resolve("native/build/linux/libsecp256k1-jni.so")) { rename { "libsecp256k1-jni-linux-x86_64.so" } } classpath = sourceSets["main"].compileClasspath
from(rootDir.resolve("native/build/darwin/libsecp256k1-jni.dylib")) { rename { "libsecp256k1-jni-darwin-x86_64.dylib" } } destinationDir = file("${buildDir}/generated/jni")
from(rootDir.resolve("native/build/mingw/secp256k1-jni.dll")) { rename { "secp256k1-jni-mingw-x86_64.dll" } } source = sourceSets["main"].java
into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native")) options.compilerArgs = listOf(
} "-h", file("${buildDir}/generated/jni").absolutePath,
"-d", file("${buildDir}/generated/jni-tmp").absolutePath
afterEvaluate { )
configure(listOf("Debug", "Release").map { tasks["externalNativeBuild$it"] }) { // options.verbose = true
dependsOn(":native:buildSecp256k1Android") doLast {
delete(file("${buildDir}/generated/jni-tmp"))
} }
} }

25
jni/jvm/build.gradle.kts Normal file
View File

@ -0,0 +1,25 @@
plugins {
kotlin("jvm")
}
kotlin {
explicitApi()
}
dependencies {
api(project(":jni"))
implementation(kotlin("stdlib-jdk8"))
}
val copyJni by tasks.creating(Sync::class) {
dependsOn(":native:buildSecp256k1Jvm")
from(rootDir.resolve("native/build/linux/libsecp256k1-jni.so")) { rename { "libsecp256k1-jni-linux-x86_64.so" } }
from(rootDir.resolve("native/build/darwin/libsecp256k1-jni.dylib")) { rename { "libsecp256k1-jni-darwin-x86_64.dylib" } }
from(rootDir.resolve("native/build/mingw/secp256k1-jni.dll")) { rename { "secp256k1-jni-mingw-x86_64.dll" } }
into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native"))
}
(tasks["processResources"] as ProcessResources).apply {
dependsOn("copyJni")
from(buildDir.resolve("jniResources"))
}

View File

@ -14,7 +14,7 @@ import java.util.*
* *
* @author leo * @author leo
*/ */
public actual object NativeSecp256k1Loader { public object NativeSecp256k1Loader {
private var extracted = false private var extracted = false
/** /**
@ -26,7 +26,7 @@ public actual object NativeSecp256k1Loader {
@JvmStatic @JvmStatic
@Synchronized @Synchronized
@Throws(Exception::class) @Throws(Exception::class)
public actual fun load(): Secp256k1 { public fun load(): Secp256k1 {
// only cleanup before the first extract // only cleanup before the first extract
if (!extracted) { if (!extracted) {
cleanup() cleanup()

View File

@ -1,14 +0,0 @@
cmake_minimum_required(VERSION 3.10.0)
add_library( secp256k1-jni SHARED
${CMAKE_CURRENT_LIST_DIR}/../../../native/jni/src/org_bitcoin_NativeSecp256k1.c
${CMAKE_CURRENT_LIST_DIR}/../../../native/jni/src/org_bitcoin_Secp256k1Context.c
)
target_include_directories( secp256k1-jni
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../native/secp256k1
)
target_link_libraries( secp256k1-jni
${CMAKE_CURRENT_LIST_DIR}/../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a
)

View File

@ -1,10 +0,0 @@
package fr.acinq.secp256k1.jni
import fr.acinq.secp256k1.Secp256k1
public expect object NativeSecp256k1Loader {
public fun load(): Secp256k1
}

View File

@ -0,0 +1,24 @@
package org.bitcoin;
import java.nio.ByteBuffer;
public class Secp256k1CFunctions {
static native long secp256k1_init_context();
static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context);
static native byte[][] secp256k1_privkey_negate(ByteBuffer byteBuff, long context);
static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context);
static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context);
static native byte[][] secp256k1_pubkey_negate(ByteBuffer byteBuff, long context, int pubLen);
static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen);
static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen);
static native void secp256k1_destroy_context(long context);
static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen);
static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, boolean compact, long context);
static native byte[][] secp256k1_ecdsa_normalize(ByteBuffer byteBuff, int sigLen, boolean compact, long context);
static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context);
static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, boolean compressed, long context);
static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen, boolean compressed);
static native byte[][] secp256k1_ec_pubkey_add(ByteBuffer byteBuff, long context, int lent1, int len2);
static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen);
static native byte[][] secp256k1_ecdsa_recover(ByteBuffer byteBuff, long context, int recid, boolean compressed);
}

View File

@ -40,7 +40,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock
* or point the JVM to the folder containing it with -Djava.library.path * or point the JVM to the folder containing it with -Djava.library.path
* *
*/ */
internal object NativeSecp256k1 : Secp256k1 { public object NativeSecp256k1 : Secp256k1 {
private val rwl = ReentrantReadWriteLock() private val rwl = ReentrantReadWriteLock()
private val r: Lock = rwl.readLock() private val r: Lock = rwl.readLock()
private val w: Lock = rwl.writeLock() private val w: Lock = rwl.writeLock()
@ -80,7 +80,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val byteBuff = pack(data, signature, pub) val byteBuff = pack(data, signature, pub)
r.lock() r.lock()
return try { return try {
secp256k1_ecdsa_verify( Secp256k1CFunctions.secp256k1_ecdsa_verify(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
signature.size, signature.size,
@ -107,7 +107,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ecdsa_sign( Secp256k1CFunctions.secp256k1_ecdsa_sign(
byteBuff, byteBuff,
format == SigFormat.COMPACT, format == SigFormat.COMPACT,
Secp256k1Context.getContext() Secp256k1Context.getContext()
@ -133,7 +133,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ecdsa_normalize( Secp256k1CFunctions.secp256k1_ecdsa_normalize(
byteBuff, byteBuff,
sig.size, sig.size,
format == SigFormat.COMPACT, format == SigFormat.COMPACT,
@ -165,7 +165,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val byteBuff = pack(seckey) val byteBuff = pack(seckey)
r.lock() r.lock()
return try { return try {
secp256k1_ec_seckey_verify( Secp256k1CFunctions.secp256k1_ec_seckey_verify(
byteBuff, byteBuff,
Secp256k1Context.getContext() Secp256k1Context.getContext()
) == 1 ) == 1
@ -189,7 +189,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ec_pubkey_create( Secp256k1CFunctions.secp256k1_ec_pubkey_create(
byteBuff, byteBuff,
format == PubKeyFormat.COMPRESSED, format == PubKeyFormat.COMPRESSED,
Secp256k1Context.getContext() Secp256k1Context.getContext()
@ -216,7 +216,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ec_pubkey_parse( Secp256k1CFunctions.secp256k1_ec_pubkey_parse(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey.size, pubkey.size,
@ -244,7 +244,7 @@ internal object NativeSecp256k1 : Secp256k1 {
override fun cleanup() { override fun cleanup() {
w.lock() w.lock()
try { try {
secp256k1_destroy_context(Secp256k1Context.getContext()) Secp256k1CFunctions.secp256k1_destroy_context(Secp256k1Context.getContext())
} finally { } finally {
w.unlock() w.unlock()
} }
@ -257,7 +257,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_privkey_negate( Secp256k1CFunctions.secp256k1_privkey_negate(
byteBuff, byteBuff,
Secp256k1Context.getContext() Secp256k1Context.getContext()
) )
@ -291,7 +291,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_privkey_tweak_mul( Secp256k1CFunctions.secp256k1_privkey_tweak_mul(
byteBuff, byteBuff,
Secp256k1Context.getContext() Secp256k1Context.getContext()
) )
@ -325,7 +325,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_privkey_tweak_add( Secp256k1CFunctions.secp256k1_privkey_tweak_add(
byteBuff, byteBuff,
Secp256k1Context.getContext() Secp256k1Context.getContext()
) )
@ -347,7 +347,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_pubkey_negate( Secp256k1CFunctions.secp256k1_pubkey_negate(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey.size pubkey.size
@ -378,7 +378,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_pubkey_tweak_add( Secp256k1CFunctions.secp256k1_pubkey_tweak_add(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey.size pubkey.size
@ -409,7 +409,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_pubkey_tweak_mul( Secp256k1CFunctions.secp256k1_pubkey_tweak_mul(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey.size pubkey.size
@ -433,7 +433,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ec_pubkey_add( Secp256k1CFunctions.secp256k1_ec_pubkey_add(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey1.size, pubkey1.size,
@ -465,7 +465,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ecdh( Secp256k1CFunctions.secp256k1_ecdh(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
pubkey.size pubkey.size
@ -488,7 +488,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val retByteArray: Array<ByteArray> val retByteArray: Array<ByteArray>
r.lock() r.lock()
retByteArray = try { retByteArray = try {
secp256k1_ecdsa_recover( Secp256k1CFunctions.secp256k1_ecdsa_recover(
byteBuff, byteBuff,
Secp256k1Context.getContext(), Secp256k1Context.getContext(),
recid, recid,
@ -522,7 +522,7 @@ internal object NativeSecp256k1 : Secp256k1 {
val byteBuff = pack(seed) val byteBuff = pack(seed)
w.lock() w.lock()
return try { return try {
secp256k1_context_randomize( Secp256k1CFunctions.secp256k1_context_randomize(
byteBuff, byteBuff,
Secp256k1Context.getContext() Secp256k1Context.getContext()
) == 1 ) == 1
@ -530,22 +530,4 @@ internal object NativeSecp256k1 : Secp256k1 {
w.unlock() w.unlock()
} }
} }
}
@JvmStatic private external fun secp256k1_context_randomize(byteBuff: ByteBuffer, context: Long): Int
@JvmStatic private external fun secp256k1_privkey_negate(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_privkey_tweak_add(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_privkey_tweak_mul(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_pubkey_negate(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
@JvmStatic private external fun secp256k1_pubkey_tweak_add(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
@JvmStatic private external fun secp256k1_pubkey_tweak_mul(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
@JvmStatic private external fun secp256k1_destroy_context(context: Long)
@JvmStatic private external fun secp256k1_ecdsa_verify(byteBuff: ByteBuffer, context: Long, sigLen: Int, pubLen: Int): Int
@JvmStatic private external fun secp256k1_ecdsa_sign(byteBuff: ByteBuffer, compact: Boolean, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_ecdsa_normalize(byteBuff: ByteBuffer, sigLen: Int, compact: Boolean, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_ec_seckey_verify(byteBuff: ByteBuffer, context: Long): Int
@JvmStatic private external fun secp256k1_ec_pubkey_create(byteBuff: ByteBuffer, compressed: Boolean, context: Long): Array<ByteArray>
@JvmStatic private external fun secp256k1_ec_pubkey_parse(byteBuff: ByteBuffer, context: Long, inputLen: Int, compressed: Boolean): Array<ByteArray>
@JvmStatic private external fun secp256k1_ec_pubkey_add(byteBuff: ByteBuffer, context: Long, lent1: Int, len2: Int): Array<ByteArray>
@JvmStatic private external fun secp256k1_ecdh(byteBuff: ByteBuffer, context: Long, inputLen: Int): Array<ByteArray>
@JvmStatic private external fun secp256k1_ecdsa_recover(byteBuff: ByteBuffer, context: Long, recid: Int, compressed: Boolean): Array<ByteArray>
}

View File

@ -29,11 +29,8 @@ public object Secp256k1Context {
return if (!isEnabled) -1 else context //sanity check return if (!isEnabled) -1 else context //sanity check
} }
@JvmStatic private external fun secp256k1_init_context(): Long
init { //static initializer init { //static initializer
isEnabled = true isEnabled = true
context = context = Secp256k1CFunctions.secp256k1_init_context()
secp256k1_init_context()
} }
} }

View File

@ -1,9 +1,16 @@
evaluationDependsOn(":jni") evaluationDependsOn(":jni:android")
val currentOs = org.gradle.internal.os.OperatingSystem.current() 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, nativeDir: File): List<String>
class DockCross(val cross: String) : Cross() { class DockCross(val cross: String) : Cross() {
@ -73,7 +80,7 @@ fun creatingBuildSecp256k1Android(arch: String) = tasks.creating(Exec::class) {
} }
environment("TOOLCHAIN", toolchain) environment("TOOLCHAIN", toolchain)
environment("ARCH", arch) environment("ARCH", arch)
environment("ANDROID_NDK", (project(":jni").extensions["android"] as com.android.build.gradle.LibraryExtension).ndkDirectory) environment("ANDROID_NDK", (project(":jni:android").extensions["android"] as com.android.build.gradle.LibraryExtension).ndkDirectory)
commandLine("./build-android.sh") commandLine("./build-android.sh")
} }
val buildSecp256k1AndroidX86_64 by creatingBuildSecp256k1Android("x86_64") val buildSecp256k1AndroidX86_64 by creatingBuildSecp256k1Android("x86_64")
@ -82,6 +89,7 @@ val buildSecp256k1AndroidArm64v8a by creatingBuildSecp256k1Android("arm64-v8a")
val buildSecp256k1AndroidArmeabiv7a by creatingBuildSecp256k1Android("armeabi-v7a") val buildSecp256k1AndroidArmeabiv7a by creatingBuildSecp256k1Android("armeabi-v7a")
val clean by tasks.creating { val clean by tasks.creating {
group = "build"
doLast { doLast {
delete(projectDir.resolve("build")) delete(projectDir.resolve("build"))
} }

View File

@ -50,7 +50,7 @@ elif [ "$TARGET" == "mingw" ]; then
CC_OPTS="-fpic" CC_OPTS="-fpic"
fi fi
$CC -shared $CC_OPTS -o build/$TARGET/$OUTFILE jni/src/org_bitcoin_NativeSecp256k1.c jni/src/org_bitcoin_Secp256k1Context.c -Ijni/headers/ -Ijni/headers/$JNI_HEADERS/ -Isecp256k1/ -lsecp256k1 -Lbuild/$TARGET/ $ADD_LIB $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 [[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build

View File

@ -0,0 +1,157 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_bitcoin_Secp256k1CFunctions */
#ifndef _Included_org_bitcoin_Secp256k1CFunctions
#define _Included_org_bitcoin_Secp256k1CFunctions
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_init_context
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1init_1context
(JNIEnv *, jclass);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_context_randomize
* Signature: (Ljava/nio/ByteBuffer;J)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1context_1randomize
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_privkey_negate
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1negate
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_privkey_tweak_add
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1add
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_privkey_tweak_mul
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1mul
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_pubkey_negate
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1negate
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_pubkey_tweak_add
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1add
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_pubkey_tweak_mul
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1mul
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_destroy_context
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1destroy_1context
(JNIEnv *, jclass, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ecdsa_verify
* Signature: (Ljava/nio/ByteBuffer;JII)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1verify
(JNIEnv *, jclass, jobject, jlong, jint, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ecdsa_sign
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1sign
(JNIEnv *, jclass, jobject, jboolean, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ecdsa_normalize
* Signature: (Ljava/nio/ByteBuffer;IZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1normalize
(JNIEnv *, jclass, jobject, jint, jboolean, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ec_seckey_verify
* Signature: (Ljava/nio/ByteBuffer;J)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1seckey_1verify
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ec_pubkey_create
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1create
(JNIEnv *, jclass, jobject, jboolean, jlong);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ec_pubkey_parse
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1parse
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ec_pubkey_add
* Signature: (Ljava/nio/ByteBuffer;JII)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1add
(JNIEnv *, jclass, jobject, jlong, jint, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ecdh
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdh
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_Secp256k1CFunctions
* Method: secp256k1_ecdsa_recover
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1recover
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,157 +0,0 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_bitcoin_NativeSecp256k1 */
#ifndef _Included_org_bitcoin_NativeSecp256k1
#define _Included_org_bitcoin_NativeSecp256k1
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ctx_clone
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone
(JNIEnv *, jclass, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_context_randomize
* Signature: (Ljava/nio/ByteBuffer;J)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_privkey_negate
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1negate
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_privkey_tweak_add
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_privkey_tweak_mul
* Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_pubkey_negate
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1negate
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_pubkey_tweak_add
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_pubkey_tweak_mul
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_destroy_context
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context
(JNIEnv *, jclass, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdsa_verify
* Signature: (Ljava/nio/ByteBuffer;JII)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
(JNIEnv *, jclass, jobject, jlong, jint, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdsa_sign
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign
(JNIEnv *, jclass, jobject, jboolean, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdsa_normalize
* Signature: (Ljava/nio/ByteBuffer;I114:1ZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1normalize
(JNIEnv *, jclass, jobject, jint, jboolean, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ec_seckey_verify
* Signature: (Ljava/nio/ByteBuffer;J)I
*/
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify
(JNIEnv *, jclass, jobject, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ec_pubkey_create
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create
(JNIEnv *, jclass, jobject, jboolean, jlong);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ec_pubkey_parse
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ec_pubkey_add
* Signature: (Ljava/nio/ByteBuffer;JII)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1add
(JNIEnv *, jclass, jobject, jlong, jint, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdh
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh
(JNIEnv *, jclass, jobject, jlong, jint);
/*
* Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdsa_recover
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
*/
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1recover
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,13 +1,23 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "org_bitcoin_NativeSecp256k1.h" #include "org_bitcoin_Secp256k1CFunctions.h"
#include "include/secp256k1.h" #include "include/secp256k1.h"
#include "include/secp256k1_ecdh.h" #include "include/secp256k1_ecdh.h"
#include "include/secp256k1_recovery.h" #include "include/secp256k1_recovery.h"
SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1init_1context
(JNIEnv* env, jclass classObject)
{
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
(void)classObject;(void)env;
return (uintptr_t)ctx;
}
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ctx_1clone
(JNIEnv* env, jclass classObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jlong ctx_l)
{ {
const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -20,7 +30,7 @@ SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clo
} }
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1context_1randomize
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -33,7 +43,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1
} }
SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context SECP256K1_API void JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1destroy_1context
(JNIEnv* env, jclass classObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -43,7 +53,7 @@ SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1
(void)classObject;(void)env; (void)classObject;(void)env;
} }
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1verify
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -75,7 +85,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1ve
return ret; return ret;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1sign
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compact, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compact, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -121,7 +131,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1normalize SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1normalize
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jint siglen, jboolean compact, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jint siglen, jboolean compact, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -178,7 +188,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
} }
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1seckey_1verify
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -189,7 +199,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1secke
return secp256k1_ec_seckey_verify(ctx, secKey); return secp256k1_ec_seckey_verify(ctx, secKey);
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1create
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compressed, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compressed, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -230,7 +240,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1parse
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint inputlen, jboolean compressed) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint inputlen, jboolean compressed)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -271,7 +281,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1negate SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1negate
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -305,7 +315,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1add
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -340,7 +350,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1mul
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -375,7 +385,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
return retArray; return retArray;
} }
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1negate JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1negate
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -418,7 +428,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubke
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1add
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -463,7 +473,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1mul
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -507,7 +517,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
return retArray; return retArray;
} }
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1add JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1add
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen1, jint publen2) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen1, jint publen2)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -554,7 +564,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1p
return retArray; return retArray;
} }
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdh
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
@ -605,7 +615,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
* Method: secp256k1_ecdsa_recover * Method: secp256k1_ecdsa_recover
* Signature: (Ljava/nio/ByteBuffer;JI)[[B * Signature: (Ljava/nio/ByteBuffer;JI)[[B
*/ */
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1recover JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1recover
(JNIEnv *env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint recid, jboolean compressed) (JNIEnv *env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint recid, jboolean compressed)
{ {
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;

View File

@ -1,15 +0,0 @@
#include <stdlib.h>
#include <stdint.h>
#include "org_bitcoin_Secp256k1Context.h"
#include "include/secp256k1.h"
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
(JNIEnv* env, jclass classObject)
{
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
(void)classObject;(void)env;
return (uintptr_t)ctx;
}

View File

@ -1,22 +0,0 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include "include/secp256k1.h"
/* Header for class org_bitcoin_Secp256k1Context */
#ifndef _Included_org_bitcoin_Secp256k1Context
#define _Included_org_bitcoin_Secp256k1Context
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_bitcoin_Secp256k1Context
* Method: secp256k1_init_context
* Signature: ()J
*/
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -10,5 +10,8 @@ rootProject.name = "secp256k1-kmp"
include( include(
":native", ":native",
":jni" ":jni",
":jni:android",
":jni:jvm"
// ":jni"
) )

View File

@ -2,11 +2,11 @@ package fr.acinq.secp256k1
import kotlin.jvm.JvmStatic import kotlin.jvm.JvmStatic
internal object Hex { public object Hex {
private val hexCode = arrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f') private val hexCode = arrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
@JvmStatic @JvmStatic
fun decode(hex: String): ByteArray { public fun decode(hex: String): ByteArray {
val input = hex.filterNot { it.isWhitespace() } val input = hex.filterNot { it.isWhitespace() }
val offset = when { val offset = when {
input.length >= 2 && input[0] == '0' && input[1] == 'x' -> 2 input.length >= 2 && input[0] == '0' && input[1] == 'x' -> 2
@ -32,7 +32,7 @@ internal object Hex {
} }
@JvmStatic @JvmStatic
fun encode(input: ByteArray, offset: Int, len: Int): String { public fun encode(input: ByteArray, offset: Int, len: Int): String {
val r = StringBuilder(len * 2) val r = StringBuilder(len * 2)
for (i in 0 until len) { for (i in 0 until len) {
val b = input[offset + i] val b = input[offset + i]
@ -43,5 +43,5 @@ internal object Hex {
} }
@JvmStatic @JvmStatic
fun encode(input: ByteArray): String = encode(input, 0, input.size) public fun encode(input: ByteArray): String = encode(input, 0, input.size)
} }