Как использовать обертку NativeSecp256k1 от Bitcoinj в Android?

Насколько я понимаю, библиотека bitcoinj содержит оболочку для функций ядра биткойна — NativeSecp256k1. Я пытаюсь вызвать один из методов из этой оболочки:

NativeSecp256k1.secKeyVerify(byteArrayOf(...))

Но у меня произошел сбой:

java.lang.UnsatisfiedLinkError: No implementation found for int org.bitcoin.NativeSecp256k1.secp256k1_ec_seckey_verify(java.nio.ByteBuffer, long) (tried Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify and Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify__Ljava_nio_ByteBuffer_2J) at org.bitcoin.NativeSecp256k1.secp256k1_ec_seckey_verify(Native Method) at org.bitcoin. NativeSecp256k1.secKeyVerify(NativeSecp256k1.java:134) в com.my.app.MainActivity.onCreate(MainActivity.kt:15) в android.app.Activity.performCreate(Activity.java:6251) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1107) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) в android.app.ActivityThread.-wrap11(ActivityThread.java ) в android.app.ActivityThread$H.handleMessa ge(ActivityThread.java:1344) в android.os.Handler.dispatchMessage(Handler.java:102) в android.os.Looper.loop(Looper.java:148) в android.app.ActivityThread.main(ActivityThread.java :5417) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

Похоже, что библиотека bitcoinj содержит обертку, но не содержит нативной библиотеки, которая используется в этой обертке. Как решить эту проблему?


person BArtWell    schedule 24.06.2019    source источник


Ответы (1)


Bitcoinj использует JNI для загрузки библиотеки C для операций с кривой secp256k1. Если библиотека импортирована правильно... и поскольку вы пытаетесь получить к ней прямой доступ, вы можете пропустить вызов System.loadLibrary('secp256k1')

Проверьте здесь: https://github.com/bitcoinj/bitcoinj/blob/2ec193f8479425c3a66bebf5f2d3493e39e88f7c/core/src/main/java/org/bitcoin/Secp256k1Context.java

Чтобы собрать исходные коды компиляции для библиотеки, ее описание описано в блоке комментариев класса NativeSecp256k1, здесь: /org/bitcoin/NativeSecp256k1.java#L34" rel="nofollow noreferrer">https://github.com/bitcoinj/bitcoinj/blob/2ec193f8479425c3a66bebf5f2d3493e39e88f7c/core/src/main/java/org/bitcoin/NativeSecp256k1.java# L34

person ehanoc    schedule 24.06.2019
comment
Когда я пытаюсь позвонить System.loadLibrary("secp256k1"), я получаю сообщение об ошибке couldn't find "libsecp256k1.so". - person BArtWell; 24.06.2019
comment
@BArtWell, вам нужно иметь скомпилированные двоичные файлы. Это описано здесь github .com/bitcoinj/bitcoinj/blob/ . Но вам нужно будет адаптироваться к вашему проекту Android. Посмотрите примеры использования JNI - person ehanoc; 24.06.2019
comment
Как вы импортируете биткойн в свой проект? - person ehanoc; 24.06.2019
comment
Спасибо за помощь. У меня работает с MinGW и командой ./configure --enable-ecmult-static-precomputation --enable-experimental --with-bignum=no --with-asm=arm --host=arm-linux-androideabi CC=armv7a-linux-androideabi21-clang CFLAGS="-mthumb -march=armv7-a" CCASFLAGS="-Wa,-mthumb -Wa,-march=armv7-a" --enable-jni --enable-experimental --enable-module-schnorr --enable-module-ecdh. Также я заменяю config.guess и config.sub следующим: git.savannah.gnu.org/gitweb/?p=config.git;a=tree - person BArtWell; 25.06.2019