Skip to content

Commit c6eb1c8

Browse files
committed
Applied patch for opposite of bitcoin-core#682 (Remove Java Native Interface)
implement exported `parse` function in JNI This function was already exported but not implemented. renamed `parse` to `decompress` a little more consistency in method comments removed dependency on google guava library It seemed a little overkill given that we only use one trivial function from this library. fixed github link bitcoin->bitcoin-core tests: removed guava dependency + cleanup added pub key parsing tests add `compressed` arg to methods returning a pubkey removed unreachable null check fixup: typo in tests removed UnsatisfiedLinkError printed to stdout removed download of guava lib in travis build removed useless 'throws' re-implemented 'isValidPubKey' by calling 'decompress' tentatively remove guava from makefile.am Added java tests to make check when jni is enabled Removed check-java from tests
1 parent e15649d commit c6eb1c8

13 files changed

+1648
-5
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ compiler:
1717
- gcc
1818
env:
1919
global:
20-
- FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ECMULTGENPRECISION=auto ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no SCHNORRSIG=no EXPERIMENTAL=no CTIMETEST=yes BENCH=yes ITERS=2
20+
- FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ECMULTGENPRECISION=auto ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no SCHNORRSIG=no EXPERIMENTAL=no CTIMETEST=yes BENCH=yes ITERS=2 JNI=no
2121
matrix:
2222
- SCALAR=32bit RECOVERY=yes
2323
- SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes SCHNORRSIG=yes
@@ -34,6 +34,7 @@ env:
3434
- BUILD=distcheck CTIMETEST= BENCH=
3535
- CPPFLAGS=-DDETERMINISTIC
3636
- CFLAGS=-O0 CTIMETEST=
37+
- BUILD=check-java JNI=yes ECDH=yes EXPERIMENTAL=yes
3738
- ECMULTGENPRECISION=2
3839
- ECMULTGENPRECISION=8
3940
- VALGRIND=yes ENDOMORPHISM=yes BIGNUM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD=

Makefile.am

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
ACLOCAL_AMFLAGS = -I build-aux/m4
22

33
lib_LTLIBRARIES = libsecp256k1.la
4+
if USE_JNI
5+
JNI_LIB = libsecp256k1_jni.la
6+
noinst_LTLIBRARIES = $(JNI_LIB)
7+
else
8+
JNI_LIB =
9+
endif
410
include_HEADERS = include/secp256k1.h
511
include_HEADERS += include/secp256k1_preallocated.h
612
noinst_HEADERS =
@@ -34,6 +40,8 @@ noinst_HEADERS += src/field_5x52.h
3440
noinst_HEADERS += src/field_5x52_impl.h
3541
noinst_HEADERS += src/field_5x52_int128_impl.h
3642
noinst_HEADERS += src/field_5x52_asm_impl.h
43+
noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h
44+
noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h
3745
noinst_HEADERS += src/util.h
3846
noinst_HEADERS += src/scratch.h
3947
noinst_HEADERS += src/scratch_impl.h
@@ -67,7 +75,10 @@ endif
6775

6876
libsecp256k1_la_SOURCES = src/secp256k1.c
6977
libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)
70-
libsecp256k1_la_LIBADD = $(SECP_LIBS) $(COMMON_LIB)
78+
libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB)
79+
80+
libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c
81+
libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES)
7182

7283
if VALGRIND_ENABLED
7384
libsecp256k1_la_CPPFLAGS += -DVALGRIND
@@ -121,6 +132,29 @@ exhaustive_tests_LDFLAGS = -static
121132
TESTS += exhaustive_tests
122133
endif
123134

135+
JAVAROOT=src/java
136+
JAVAORG=org/bitcoin
137+
JAVA_FILES= \
138+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \
139+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \
140+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \
141+
$(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java
142+
143+
if USE_JNI
144+
145+
.stamp-java: $(JAVA_FILES)
146+
@echo Compiling $^
147+
$(AM_V_at) javac $^
148+
@touch $@
149+
150+
if USE_TESTS
151+
152+
check-java: libsecp256k1.la .stamp-java
153+
$(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test
154+
155+
endif
156+
endif
157+
124158
if USE_ECMULT_STATIC_PRECOMPUTATION
125159
CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) -I$(builddir)/src
126160

@@ -140,10 +174,10 @@ $(bench_ecmult_OBJECTS): src/ecmult_static_context.h
140174
src/ecmult_static_context.h: $(gen_context_BIN)
141175
./$(gen_context_BIN)
142176

143-
CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h
177+
CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java
144178
endif
145179

146-
EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h
180+
EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES)
147181

148182
if ENABLE_MODULE_ECDH
149183
include src/modules/ecdh/Makefile.am.include

build-aux/m4/ax_jni_include_dir.m4

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# ===========================================================================
2+
# https://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
3+
# ===========================================================================
4+
#
5+
# SYNOPSIS
6+
#
7+
# AX_JNI_INCLUDE_DIR
8+
#
9+
# DESCRIPTION
10+
#
11+
# AX_JNI_INCLUDE_DIR finds include directories needed for compiling
12+
# programs using the JNI interface.
13+
#
14+
# JNI include directories are usually in the Java distribution. This is
15+
# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in
16+
# that order. When this macro completes, a list of directories is left in
17+
# the variable JNI_INCLUDE_DIRS.
18+
#
19+
# Example usage follows:
20+
#
21+
# AX_JNI_INCLUDE_DIR
22+
#
23+
# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS
24+
# do
25+
# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR"
26+
# done
27+
#
28+
# If you want to force a specific compiler:
29+
#
30+
# - at the configure.in level, set JAVAC=yourcompiler before calling
31+
# AX_JNI_INCLUDE_DIR
32+
#
33+
# - at the configure level, setenv JAVAC
34+
#
35+
# Note: This macro can work with the autoconf M4 macros for Java programs.
36+
# This particular macro is not part of the original set of macros.
37+
#
38+
# LICENSE
39+
#
40+
# Copyright (c) 2008 Don Anderson <[email protected]>
41+
#
42+
# Copying and distribution of this file, with or without modification, are
43+
# permitted in any medium without royalty provided the copyright notice
44+
# and this notice are preserved. This file is offered as-is, without any
45+
# warranty.
46+
47+
#serial 14
48+
49+
AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR])
50+
AC_DEFUN([AX_JNI_INCLUDE_DIR],[
51+
52+
JNI_INCLUDE_DIRS=""
53+
54+
if test "x$JAVA_HOME" != x; then
55+
_JTOPDIR="$JAVA_HOME"
56+
else
57+
if test "x$JAVAC" = x; then
58+
JAVAC=javac
59+
fi
60+
AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no])
61+
if test "x$_ACJNI_JAVAC" = xno; then
62+
AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME])
63+
fi
64+
_ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC")
65+
_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`
66+
fi
67+
68+
case "$host_os" in
69+
darwin*) # Apple Java headers are inside the Xcode bundle.
70+
macos_version=$(sw_vers -productVersion | sed -n -e 's/^@<:@0-9@:>@*.\(@<:@0-9@:>@*\).@<:@0-9@:>@*/\1/p')
71+
if @<:@ "$macos_version" -gt "7" @:>@; then
72+
_JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework"
73+
_JINC="$_JTOPDIR/Headers"
74+
else
75+
_JTOPDIR="/System/Library/Frameworks/JavaVM.framework"
76+
_JINC="$_JTOPDIR/Headers"
77+
fi
78+
;;
79+
*) _JINC="$_JTOPDIR/include";;
80+
esac
81+
_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])
82+
_AS_ECHO_LOG([_JINC=$_JINC])
83+
84+
# On Mac OS X 10.6.4, jni.h is a symlink:
85+
# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h
86+
# -> ../../CurrentJDK/Headers/jni.h.
87+
AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path,
88+
[
89+
if test -f "$_JINC/jni.h"; then
90+
ac_cv_jni_header_path="$_JINC"
91+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
92+
else
93+
_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
94+
if test -f "$_JTOPDIR/include/jni.h"; then
95+
ac_cv_jni_header_path="$_JTOPDIR/include"
96+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
97+
else
98+
ac_cv_jni_header_path=none
99+
fi
100+
fi
101+
])
102+
103+
# get the likely subdirectories for system specific java includes
104+
case "$host_os" in
105+
bsdi*) _JNI_INC_SUBDIRS="bsdos";;
106+
freebsd*) _JNI_INC_SUBDIRS="freebsd";;
107+
darwin*) _JNI_INC_SUBDIRS="darwin";;
108+
linux*) _JNI_INC_SUBDIRS="linux genunix";;
109+
osf*) _JNI_INC_SUBDIRS="alpha";;
110+
solaris*) _JNI_INC_SUBDIRS="solaris";;
111+
mingw*) _JNI_INC_SUBDIRS="win32";;
112+
cygwin*) _JNI_INC_SUBDIRS="win32";;
113+
*) _JNI_INC_SUBDIRS="genunix";;
114+
esac
115+
116+
if test "x$ac_cv_jni_header_path" != "xnone"; then
117+
# add any subdirectories that are present
118+
for JINCSUBDIR in $_JNI_INC_SUBDIRS
119+
do
120+
if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
121+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
122+
fi
123+
done
124+
fi
125+
])
126+
127+
# _ACJNI_FOLLOW_SYMLINKS <path>
128+
# Follows symbolic links on <path>,
129+
# finally setting variable _ACJNI_FOLLOWED
130+
# ----------------------------------------
131+
AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[
132+
# find the include directory relative to the javac executable
133+
_cur="$1"
134+
while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
135+
AC_MSG_CHECKING([symlink for $_cur])
136+
_slink=`ls -ld "$_cur" | sed 's/.* -> //'`
137+
case "$_slink" in
138+
/*) _cur="$_slink";;
139+
# 'X' avoids triggering unwanted echo options.
140+
*) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";;
141+
esac
142+
AC_MSG_RESULT([$_cur])
143+
done
144+
_ACJNI_FOLLOWED="$_cur"
145+
])# _ACJNI

configure.ac

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ AC_ARG_ENABLE(external_default_callbacks,
157157
[use_external_default_callbacks=$enableval],
158158
[use_external_default_callbacks=no])
159159

160+
AC_ARG_ENABLE(jni,
161+
AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni [default=no]]),
162+
[use_jni=$enableval],
163+
[use_jni=no])
164+
160165
AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
161166
[finite field implementation to use [default=auto]])],[req_field=$withval], [req_field=auto])
162167

@@ -488,6 +493,29 @@ else
488493
fi
489494
fi
490495

496+
if test x"$use_jni" != x"no"; then
497+
AX_JNI_INCLUDE_DIR
498+
have_jni_dependencies=yes
499+
if test x"$enable_module_ecdh" = x"no"; then
500+
have_jni_dependencies=no
501+
fi
502+
if test "x$JNI_INCLUDE_DIRS" = "x"; then
503+
have_jni_dependencies=no
504+
fi
505+
if test "x$have_jni_dependencies" = "xno"; then
506+
if test x"$use_jni" = x"yes"; then
507+
AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
508+
fi
509+
AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
510+
use_jni=no
511+
else
512+
use_jni=yes
513+
for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
514+
JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
515+
done
516+
fi
517+
fi
518+
491519
if test x"$set_bignum" = x"gmp"; then
492520
SECP_LIBS="$SECP_LIBS $GMP_LIBS"
493521
SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
@@ -559,6 +587,7 @@ fi
559587

560588
AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
561589
AC_CONFIG_FILES([Makefile libsecp256k1.pc])
590+
AC_SUBST(JNI_INCLUDES)
562591
AC_SUBST(SECP_INCLUDES)
563592
AC_SUBST(SECP_LIBS)
564593
AC_SUBST(SECP_TEST_LIBS)
@@ -573,6 +602,7 @@ AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"ye
573602
AM_CONDITIONAL([ENABLE_MODULE_EXTRAKEYS], [test x"$enable_module_extrakeys" = x"yes"])
574603
AM_CONDITIONAL([ENABLE_MODULE_SCHNORRSIG], [test x"$enable_module_schnorrsig" = x"yes"])
575604
AM_CONDITIONAL([ENABLE_MODULE_ECDSA_ADAPTOR], [test x"$enable_module_ecdsa_adaptor" = x"yes"])
605+
AM_CONDITIONAL([USE_JNI], [test x"$use_jni" = x"yes"])
576606
AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
577607
AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
578608

@@ -588,6 +618,7 @@ echo "Build Options:"
588618
echo " with endomorphism = $use_endomorphism"
589619
echo " with ecmult precomp = $set_precomp"
590620
echo " with external callbacks = $use_external_default_callbacks"
621+
echo " with jni = $use_jni"
591622
echo " with benchmarks = $use_benchmark"
592623
echo " with coverage = $enable_coverage"
593624
echo " module ecdh = $enable_module_ecdh"

contrib/travis.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ fi
2121
--with-field="$FIELD" --with-bignum="$BIGNUM" --with-asm="$ASM" --with-scalar="$SCALAR" \
2222
--enable-ecmult-static-precomputation="$STATICPRECOMPUTATION" --with-ecmult-gen-precision="$ECMULTGENPRECISION" \
2323
--enable-module-ecdh="$ECDH" --enable-module-recovery="$RECOVERY" \
24-
--enable-module-schnorrsig="$SCHNORRSIG" "$EXTRAFLAGS" "$USE_HOST"
24+
--enable-module-schnorrsig="$SCHNORRSIG" --enable-jni="$JNI" "$EXTRAFLAGS" "$USE_HOST"
2525

2626
if [ -n "$BUILD" ]
2727
then

0 commit comments

Comments
 (0)