Skip to content

Commit e457018

Browse files
committed
Merge bitcoin#364: JNI rebased
86e2d07 JNI library: cleanup, removed unimplemented code (GreenAddress) 3093576 JNI library (GreenAddress)
2 parents bd2895f + 86e2d07 commit e457018

13 files changed

+1490
-46
lines changed

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ addons:
66
compiler:
77
- clang
88
- gcc
9+
cache:
10+
directories:
11+
- src/java/guava/
912
env:
1013
global:
1114
- FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no schnorr=no RECOVERY=no EXPERIMENTAL=no
15+
- GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar
1216
matrix:
1317
- SCALAR=32bit RECOVERY=yes
1418
- SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes
@@ -26,6 +30,7 @@ env:
2630
- BUILD=distcheck
2731
- EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC
2832
- EXTRAFLAGS=CFLAGS=-O0
33+
- BUILD=check-java ECDH=yes SCHNORR=yes EXPERIMENTAL=yes
2934
matrix:
3035
fast_finish: true
3136
include:
@@ -55,6 +60,8 @@ matrix:
5560
packages:
5661
- gcc-multilib
5762
- libgmp-dev:i386
63+
before_install: mkdir -p `dirname $GUAVA_JAR`
64+
install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi
5865
before_script: ./autogen.sh
5966
script:
6067
- if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi

Makefile.am

Lines changed: 44 additions & 5 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
noinst_HEADERS =
612
noinst_HEADERS += src/scalar.h
@@ -32,6 +38,7 @@ noinst_HEADERS += src/field_5x52_impl.h
3238
noinst_HEADERS += src/field_5x52_int128_impl.h
3339
noinst_HEADERS += src/field_5x52_asm_impl.h
3440
noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h
41+
noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h
3542
noinst_HEADERS += src/util.h
3643
noinst_HEADERS += src/testrand.h
3744
noinst_HEADERS += src/testrand_impl.h
@@ -49,9 +56,11 @@ pkgconfigdir = $(libdir)/pkgconfig
4956
pkgconfig_DATA = libsecp256k1.pc
5057

5158
libsecp256k1_la_SOURCES = src/secp256k1.c
52-
libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)
53-
libsecp256k1_la_LIBADD = $(SECP_LIBS)
59+
libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)
60+
libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS)
5461

62+
libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c
63+
libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES)
5564

5665
noinst_PROGRAMS =
5766
if USE_BENCHMARK
@@ -68,12 +77,42 @@ endif
6877
if USE_TESTS
6978
noinst_PROGRAMS += tests
7079
tests_SOURCES = src/tests.c
71-
tests_CPPFLAGS = -DVERIFY -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES)
80+
tests_CPPFLAGS = -DSECP256K1_BUILD -DVERIFY -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES)
7281
tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS)
7382
tests_LDFLAGS = -static
7483
TESTS = tests
7584
endif
7685

86+
JAVAROOT=src/java
87+
JAVAORG=org/bitcoin
88+
JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar
89+
CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA)
90+
JAVA_FILES= \
91+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \
92+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \
93+
$(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \
94+
$(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java
95+
96+
if USE_JNI
97+
98+
$(JAVA_GUAVA):
99+
@echo Guava is missing. Fetch it via: \
100+
wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@)
101+
@false
102+
103+
.stamp-java: $(JAVA_FILES)
104+
@echo Compiling $^
105+
$(AM_V_at)$(CLASSPATH_ENV) javac $^
106+
@touch $@
107+
108+
if USE_TESTS
109+
110+
check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java
111+
$(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test
112+
113+
endif
114+
endif
115+
77116
if USE_ECMULT_STATIC_PRECOMPUTATION
78117
CPPFLAGS_FOR_BUILD +=-I$(top_srcdir)
79118
CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function
@@ -93,10 +132,10 @@ $(bench_internal_OBJECTS): src/ecmult_static_context.h
93132
src/ecmult_static_context.h: $(gen_context_BIN)
94133
./$(gen_context_BIN)
95134

96-
CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h
135+
CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java
97136
endif
98137

99-
EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h
138+
EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES)
100139

101140
if ENABLE_MODULE_ECDH
102141
include src/modules/ecdh/Makefile.am.include

build-aux/m4/ax_jni_include_dir.m4

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
# ===========================================================================
2+
# http://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 10
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*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
70+
_JINC="$_JTOPDIR/Headers";;
71+
*) _JINC="$_JTOPDIR/include";;
72+
esac
73+
_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])
74+
_AS_ECHO_LOG([_JINC=$_JINC])
75+
76+
# On Mac OS X 10.6.4, jni.h is a symlink:
77+
# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h
78+
# -> ../../CurrentJDK/Headers/jni.h.
79+
80+
AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path,
81+
[
82+
if test -f "$_JINC/jni.h"; then
83+
ac_cv_jni_header_path="$_JINC"
84+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
85+
else
86+
_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
87+
if test -f "$_JTOPDIR/include/jni.h"; then
88+
ac_cv_jni_header_path="$_JTOPDIR/include"
89+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
90+
else
91+
ac_cv_jni_header_path=none
92+
fi
93+
fi
94+
])
95+
96+
97+
98+
# get the likely subdirectories for system specific java includes
99+
case "$host_os" in
100+
bsdi*) _JNI_INC_SUBDIRS="bsdos";;
101+
darwin*) _JNI_INC_SUBDIRS="darwin";;
102+
freebsd*) _JNI_INC_SUBDIRS="freebsd";;
103+
linux*) _JNI_INC_SUBDIRS="linux genunix";;
104+
osf*) _JNI_INC_SUBDIRS="alpha";;
105+
solaris*) _JNI_INC_SUBDIRS="solaris";;
106+
mingw*) _JNI_INC_SUBDIRS="win32";;
107+
cygwin*) _JNI_INC_SUBDIRS="win32";;
108+
*) _JNI_INC_SUBDIRS="genunix";;
109+
esac
110+
111+
if test "x$ac_cv_jni_header_path" != "xnone"; then
112+
# add any subdirectories that are present
113+
for JINCSUBDIR in $_JNI_INC_SUBDIRS
114+
do
115+
if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
116+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
117+
fi
118+
done
119+
fi
120+
])
121+
122+
# _ACJNI_FOLLOW_SYMLINKS <path>
123+
# Follows symbolic links on <path>,
124+
# finally setting variable _ACJNI_FOLLOWED
125+
# ----------------------------------------
126+
AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[
127+
# find the include directory relative to the javac executable
128+
_cur="$1"
129+
while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
130+
AC_MSG_CHECKING([symlink for $_cur])
131+
_slink=`ls -ld "$_cur" | sed 's/.* -> //'`
132+
case "$_slink" in
133+
/*) _cur="$_slink";;
134+
# 'X' avoids triggering unwanted echo options.
135+
*) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";;
136+
esac
137+
AC_MSG_RESULT([$_cur])
138+
done
139+
_ACJNI_FOLLOWED="$_cur"
140+
])# _ACJNI

configure.ac

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ AC_ARG_ENABLE(module_recovery,
123123
[enable_module_recovery=$enableval],
124124
[enable_module_recovery=no])
125125

126+
AC_ARG_ENABLE(jni,
127+
AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
128+
[use_jni=$enableval],
129+
[use_jni=auto])
130+
126131
AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
127132
[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
128133

@@ -323,6 +328,22 @@ if test x"$use_tests" = x"yes"; then
323328
fi
324329
fi
325330

331+
if test x"$use_jni" != x"no"; then
332+
AX_JNI_INCLUDE_DIR
333+
if test "x$JNI_INCLUDE_DIRS" = "x"; then
334+
if test x"$use_jni" = x"yes"; then
335+
AC_MSG_ERROR([jni support explicitly requested but headers were not found])
336+
fi
337+
AC_MSG_WARN([jni headers not found. jni support disabled])
338+
use_jni=no
339+
else
340+
use_jni=yes
341+
for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
342+
JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
343+
done
344+
fi
345+
fi
346+
326347
if test x"$set_bignum" = x"gmp"; then
327348
SECP_LIBS="$SECP_LIBS $GMP_LIBS"
328349
SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
@@ -355,7 +376,10 @@ AC_MSG_NOTICE([Using field implementation: $set_field])
355376
AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
356377
AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
357378
AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
379+
AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
380+
AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
358381
AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
382+
AC_MSG_NOTICE([Using jni: $use_jni])
359383

360384
if test x"$enable_experimental" = x"yes"; then
361385
AC_MSG_NOTICE([******])
@@ -375,6 +399,7 @@ fi
375399

376400
AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
377401
AC_CONFIG_FILES([Makefile libsecp256k1.pc])
402+
AC_SUBST(JNI_INCLUDES)
378403
AC_SUBST(SECP_INCLUDES)
379404
AC_SUBST(SECP_LIBS)
380405
AC_SUBST(SECP_TEST_LIBS)
@@ -385,6 +410,7 @@ AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_pr
385410
AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
386411
AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
387412
AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
413+
AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
388414

389415
dnl make sure nothing new is exported so that we don't break the cache
390416
PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"

0 commit comments

Comments
 (0)