Skip to content

Commit bca404b

Browse files
committed
building static libraries with shared library wrapper
1 parent 1d14120 commit bca404b

File tree

5 files changed

+223
-47
lines changed

5 files changed

+223
-47
lines changed

.gitmodules

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[submodule "external/monero-cpp"]
22
path = external/monero-cpp
3-
url = https://github.com/woodser/monero-cpp
3+
url = https://github.com/nsec1/monero-cpp.git
4+
branch = buildStaticOption

CMakeLists.txt

Lines changed: 200 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ project(monero-java-jni)
1818
#############
1919

2020
set(MONERO_CPP "${CMAKE_SOURCE_DIR}/external/monero-cpp")
21-
message(STATUS MONERO_CPP : ${MONERO_CPP} : ${MONERO_CPP})
21+
message(STATUS MONERO_CPP : ${MONERO_CPP})
2222

2323
set(MONERO_CPP_SRC "${MONERO_CPP}/src")
2424
set(MONERO_PROJECT ${MONERO_CPP}/external/monero-project)
2525
set(MONERO_PROJECT_SRC "${MONERO_PROJECT}/src")
2626

27+
list(APPEND CMAKE_MODULE_PATH "${MONERO_PROJECT}/cmake")
28+
list(APPEND CMAKE_MODULE_PATH "${MONERO_CPP}/cmake")
29+
2730
# check JAVA_HOME
2831
if(NOT DEFINED ENV{JAVA_HOME} OR "$ENV{JAVA_HOME}" STREQUAL "")
2932
message(FATAL_ERROR "JAVA_HOME variable not set, for example: export JAVA_HOME=/path/to/jdk")
@@ -57,49 +60,193 @@ message(STATUS EXTRA_LIBRARIES: ${EXTRA_LIBRARIES})
5760
set(Boost_NO_BOOST_CMAKE 1)
5861
set(Boost_USE_MULTITHREADED ON)
5962
find_package(Boost 1.58 QUIET REQUIRED COMPONENTS chrono date_time filesystem program_options regex serialization wserialization system thread)
60-
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIR}")
63+
64+
if(Boost_FOUND)
65+
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIR}")
66+
message(STATUS "Using Boost lib version: ${Boost_LIB_VERSION}")
67+
message(STATUS "Using Boost libs: ${Boost_LIBRARIES}")
68+
endif()
6169

6270
############
6371
# OpenSSL
6472
############
6573

66-
if (APPLE AND NOT IOS)
67-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -std=c++14")
68-
if (NOT OPENSSL_ROOT_DIR)
69-
EXECUTE_PROCESS(COMMAND brew --prefix openssl
70-
OUTPUT_VARIABLE OPENSSL_ROOT_DIR
71-
OUTPUT_STRIP_TRAILING_WHITESPACE)
72-
message(STATUS "Using OpenSSL found at ${OPENSSL_ROOT_DIR}")
74+
find_package(OpenSSL REQUIRED)
75+
76+
if (WIN32)
77+
list(APPEND OPENSSL_LIBRARIES ws2_32 crypt32 bcrypt)
78+
endif()
79+
80+
if(OPENSSL_FOUND)
81+
message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}")
82+
message(STATUS "Using OpenSSL libs: ${OPENSSL_LIBRARIES}")
83+
endif()
84+
85+
############
86+
# libsodium
87+
############
88+
89+
find_library(SODIUM_LIBRARY sodium REQUIRED)
90+
if(SODIUM_LIBRARY)
91+
message(STATUS "Using libsodium library at ${SODIUM_LIBRARY}")
92+
find_path(SODIUM_INCLUDE_PATH sodium/crypto_verify_32.h)
93+
if (SODIUM_INCLUDE_PATH)
94+
message(STATUS "SODIUM_INCLUDE_PATH: ${SODIUM_INCLUDE_PATH}")
95+
else()
96+
message(FATAL_ERROR "Could not find required sodium/crypto_verify_32.h")
7397
endif()
7498
endif()
7599

76-
find_package(OpenSSL REQUIRED)
77-
message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}")
100+
############
101+
# HIDAPI
102+
############
78103

79-
if(STATIC AND NOT IOS)
80-
if(UNIX)
81-
set(OPENSSL_LIBRARIES "${OPENSSL_LIBRARIES};${CMAKE_DL_LIBS};${CMAKE_THREAD_LIBS_INIT}")
104+
option(USE_DEVICE_TREZOR "Trezor hardware wallet suport" ON)
105+
if (USE_DEVICE_TREZOR)
106+
if(APPLE)
107+
include_directories(SYSTEM /usr/include/malloc)
108+
if(POLICY CMP0042)
109+
cmake_policy(SET CMP0042 NEW)
110+
endif()
82111
endif()
112+
113+
find_package(HIDAPI REQUIRED)
114+
message(STATUS "Using HIDAPI include dir at ${HIDAPI_INCLUDE_DIR}")
115+
add_definitions(-DHAVE_HIDAPI)
116+
else()
117+
message(STATUS "Trezor support disabled by USE_DEVICE_TREZOR")
83118
endif()
84119

85-
if (WIN32)
86-
list(APPEND OPENSSL_LIBRARIES ws2_32 crypt32 bcrypt)
120+
121+
#############
122+
# Monero
123+
#############
124+
125+
set(MONERO_PROJECT_BUILD "${MONERO_PROJECT}/build/release" CACHE STRING "Monero project build directory")
126+
message(STATUS "Using monero-project build: " ${MONERO_PROJECT_BUILD})
127+
128+
list(APPEND CMAKE_MODULE_PATH "${MONERO_PROJECT}/cmake")
129+
130+
add_library(wallet STATIC IMPORTED)
131+
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
132+
${MONERO_PROJECT_BUILD}/lib/libwallet.a)
133+
134+
# libwallet-crypto.a provides x86_64 asm for some wallet functions
135+
if (EXISTS ${MONERO_PROJECT_BUILD}/src/crypto/wallet/libwallet-crypto.a)
136+
add_library(wallet_crypto_lib STATIC IMPORTED)
137+
set_target_properties(wallet_crypto_lib PROPERTIES IMPORTED_LOCATION
138+
${MONERO_PROJECT_BUILD}/src/crypto/wallet/libwallet-crypto.a)
139+
set(wallet_crypto wallet_crypto_lib)
140+
endif()
141+
142+
add_library(lmdb STATIC IMPORTED)
143+
set_target_properties(lmdb PROPERTIES IMPORTED_LOCATION
144+
${MONERO_PROJECT_BUILD}/external/db_drivers/liblmdb/liblmdb.a)
145+
146+
add_library(epee STATIC IMPORTED)
147+
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
148+
${MONERO_PROJECT_BUILD}/contrib/epee/src/libepee.a)
149+
150+
add_library(rpc_base STATIC IMPORTED)
151+
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
152+
${MONERO_PROJECT_BUILD}/src/rpc/librpc_base.a)
153+
154+
add_library(net STATIC IMPORTED)
155+
set_target_properties(net PROPERTIES IMPORTED_LOCATION
156+
${MONERO_PROJECT_BUILD}/src/net/libnet.a)
157+
158+
add_library(hardforks STATIC IMPORTED)
159+
set_target_properties(hardforks PROPERTIES IMPORTED_LOCATION
160+
${MONERO_PROJECT_BUILD}/src/hardforks/libhardforks.a)
161+
162+
add_library(easylogging STATIC IMPORTED)
163+
set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
164+
${MONERO_PROJECT_BUILD}/external/easylogging++/libeasylogging.a)
165+
166+
add_library(cryptonote_core STATIC IMPORTED)
167+
set_target_properties(cryptonote_core PROPERTIES IMPORTED_LOCATION
168+
${MONERO_PROJECT_BUILD}/src/cryptonote_core/libcryptonote_core.a)
169+
170+
add_library(cryptonote_basic STATIC IMPORTED)
171+
set_target_properties(cryptonote_basic PROPERTIES IMPORTED_LOCATION
172+
${MONERO_PROJECT_BUILD}/src/cryptonote_basic/libcryptonote_basic.a)
173+
174+
add_library(cryptonote_format_utils_basic STATIC IMPORTED)
175+
set_target_properties(cryptonote_format_utils_basic PROPERTIES IMPORTED_LOCATION
176+
${MONERO_PROJECT_BUILD}/src/cryptonote_basic/libcryptonote_format_utils_basic.a)
177+
178+
add_library(mnemonics STATIC IMPORTED)
179+
set_target_properties(mnemonics PROPERTIES IMPORTED_LOCATION
180+
${MONERO_PROJECT_BUILD}/src/mnemonics/libmnemonics.a)
181+
182+
add_library(common STATIC IMPORTED)
183+
set_target_properties(common PROPERTIES IMPORTED_LOCATION
184+
${MONERO_PROJECT_BUILD}/src/common/libcommon.a)
185+
186+
add_library(cncrypto STATIC IMPORTED)
187+
set_target_properties(cncrypto PROPERTIES IMPORTED_LOCATION
188+
${MONERO_PROJECT_BUILD}/src/crypto/libcncrypto.a)
189+
190+
add_library(ringct STATIC IMPORTED)
191+
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
192+
${MONERO_PROJECT_BUILD}/src/ringct/libringct.a)
193+
194+
add_library(ringct_basic STATIC IMPORTED)
195+
set_target_properties(ringct_basic PROPERTIES IMPORTED_LOCATION
196+
${MONERO_PROJECT_BUILD}/src/ringct/libringct_basic.a)
197+
198+
add_library(blockchain_db STATIC IMPORTED)
199+
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
200+
${MONERO_PROJECT_BUILD}/src/blockchain_db/libblockchain_db.a)
201+
202+
add_library(blocks STATIC IMPORTED)
203+
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
204+
${MONERO_PROJECT_BUILD}/src/blocks/libblocks.a)
205+
206+
add_library(checkpoints STATIC IMPORTED)
207+
set_target_properties(checkpoints PROPERTIES IMPORTED_LOCATION
208+
${MONERO_PROJECT_BUILD}/src/checkpoints/libcheckpoints.a)
209+
210+
add_library(device STATIC IMPORTED)
211+
set_target_properties(device PROPERTIES IMPORTED_LOCATION
212+
${MONERO_PROJECT_BUILD}/src/device/libdevice.a)
213+
214+
add_library(device_trezor STATIC IMPORTED)
215+
set_target_properties(device_trezor PROPERTIES IMPORTED_LOCATION
216+
${MONERO_PROJECT_BUILD}/src/device_trezor/libdevice_trezor.a)
217+
218+
add_library(multisig STATIC IMPORTED)
219+
set_target_properties(multisig PROPERTIES IMPORTED_LOCATION
220+
${MONERO_PROJECT_BUILD}/src/multisig/libmultisig.a)
221+
222+
add_library(version STATIC IMPORTED)
223+
set_target_properties(version PROPERTIES IMPORTED_LOCATION
224+
${MONERO_PROJECT_BUILD}/src/libversion.a)
225+
226+
add_library(randomx STATIC IMPORTED)
227+
set_target_properties(randomx PROPERTIES IMPORTED_LOCATION
228+
${MONERO_PROJECT_BUILD}/external/randomx/librandomx.a)
229+
230+
############
231+
# Unbound
232+
############
233+
234+
find_library(UNBOUND_LIBRARIES libunbound.a) # LD_LIBRARY_PATH
235+
if(UNBOUND_LIBRARIES)
236+
message(STATUS "Found libunbound library: ${UNBOUND_LIBRARIES}")
87237
endif()
88238

89239
######################
90240
# monero-cpp
91241
######################
92242

93-
add_library(monero-cpp SHARED IMPORTED)
243+
add_library(monero-cpp STATIC IMPORTED)
94244

95-
# import shared c++ library
96-
if (APPLE)
97-
set_target_properties(monero-cpp PROPERTIES IMPORTED_LOCATION ./libmonero-cpp.dylib)
98-
elseif (WIN32)
99-
set_target_properties(monero-cpp PROPERTIES IMPORTED_LOCATION ./libmonero-cpp.dll)
100-
set_target_properties(monero-cpp PROPERTIES IMPORTED_IMPLIB ./libmonero-cpp.dll.a)
245+
# import static c++ library
246+
if (WIN32)
247+
set_target_properties(monero-cpp PROPERTIES IMPORTED_LOCATION ./libmonero-cpp.lib)
101248
else()
102-
set_target_properties(monero-cpp PROPERTIES IMPORTED_LOCATION ./libmonero-cpp.so)
249+
set_target_properties(monero-cpp PROPERTIES IMPORTED_LOCATION ./libmonero-cpp.a)
103250
endif()
104251

105252
###############################################
@@ -116,19 +263,19 @@ target_include_directories(monero-java PUBLIC
116263
"$ENV{JAVA_HOME}"
117264
"$ENV{JAVA_HOME}/include"
118265
"${MONERO_CPP}/external/libsodium/include/sodium"
119-
"${MONERO_CPP}/external/openssl-sdk/include"
120266
"${MONERO_CPP_SRC}/"
121267
"${MONERO_PROJECT}/contrib/epee/include"
122268
"${MONERO_PROJECT}/external/"
123269
"${MONERO_PROJECT}/external/easylogging++"
124270
"${MONERO_PROJECT}/external/rapidjson/include"
125271
"${MONERO_PROJECT_SRC}/"
126272
"${MONERO_PROJECT_SRC}/crypto"
127-
"${MONERO_PROJECT_SRC}/crypto/crypto_ops_builder/include/"
128273
"${MONERO_PROJECT_SRC}/wallet"
129274
"${MONERO_PROJECT_SRC}/wallet/api"
275+
${SODIUM_INCLUDE_PATH}
130276
${Boost_INCLUDE_DIR}
131277
${OPENSSL_INCLUDE_DIR}
278+
${HIDAPI_INCLUDE_DIR}
132279
)
133280

134281
if (APPLE)
@@ -141,8 +288,35 @@ endif()
141288

142289
target_link_libraries(monero-java
143290
monero-cpp
291+
wallet
292+
rpc_base
293+
net
294+
lmdb
295+
easylogging
296+
cryptonote_core
297+
cryptonote_basic
298+
cryptonote_format_utils_basic
299+
mnemonics
300+
ringct
301+
ringct_basic
302+
common
303+
cncrypto
304+
blockchain_db
305+
blocks
306+
checkpoints
307+
device
308+
device_trezor
309+
multisig
310+
version
311+
randomx
312+
epee
313+
hardforks
314+
${wallet_crypto}
315+
${UNBOUND_LIBRARIES}
144316
${Boost_LIBRARIES}
145317
${OPENSSL_LIBRARIES}
318+
${SODIUM_LIBRARY}
319+
${HIDAPI_LIBRARIES}
146320
${EXTRA_LIBRARIES}
147321
)
148322

bin/build_libmonero_java.sh

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,25 @@
22

33
#EMCC_DEBUG=1
44

5-
HOST_NCORES=$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
5+
export HOST_NCORES=${HOST_NCORES-$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)}
6+
BUILD_DIR="$(pwd)/build"
7+
export CMAKE_PREFIX_PATH="$(pwd)/external/monero-cpp/build/install"${CMAKE_PREFIX_PATH+:$CMAKE_PREFIX_PATH}
8+
export USE_DEVICE_TREZOR=OFF
9+
echo "HOST_NCORES=$HOST_NCORES in $0"
10+
echo "CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH in $0"
11+
echo "USE_DEVICE_TREZOR=$USE_DEVICE_TREZOR in $0"
612

7-
# build libmonero-cpp shared library
8-
cd ./external/monero-cpp/ &&
9-
./bin/build_libmonero_cpp.sh &&
13+
[ -d $BUILD_DIR ] || mkdir -p $BUILD_DIR
1014

11-
# copy libmonero-cpp shared library to ./build
12-
cd ../../ &&
13-
mkdir -p ./build &&
14-
cp ./external/monero-cpp/build/libmonero-cpp.* ./build &&
15+
# build libmonero-cpp static library
16+
(cd ./external/monero-cpp/ && \
17+
./bin/build_libmonero_cpp.sh -DSTATIC=ON) && \
18+
19+
# copy libmonero-cpp static library to ./build
20+
cp ./external/monero-cpp/build/libmonero-cpp.* $BUILD_DIR && \
1521

1622
# build libmonero-java shared library to ./build
17-
cd build &&
18-
cmake .. &&
23+
cd $BUILD_DIR && \
24+
cmake -D USE_DEVICE_TREZOR=$USE_DEVICE_TREZOR .. && \
1925
cmake --build . -j$HOST_NCORES &&
20-
make .
26+
make -j$HOST_NCORES .

src/main/java/monero/common/MoneroUtils.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,18 @@ public static void loadNativeLibrary() {
7676

7777
// get library file names and paths
7878
String libraryPath = "/";
79-
String libraryCppFile = null;
8079
String libraryJavaFile = null;
8180
if (osName.contains("windows")) {
8281
libraryPath += "windows/";
83-
libraryFiles = new String[] { "libmonero-cpp.dll", "libmonero-cpp.dll.a", "libmonero-java.dll", "libmonero-java.dll.a" };
84-
libraryCppFile = "libmonero-cpp.dll";
82+
libraryFiles = new String[] { "libmonero-java.dll", "libmonero-java.dll.a" };
8583
libraryJavaFile = "libmonero-java.dll";
8684
} else if (osName.contains("linux")) {
8785
libraryPath += osArch.contains("aarch64") ? "linux-arm64/" : "linux-x86_64/";
88-
libraryFiles = new String[] { "libmonero-cpp.so", "libmonero-java.so" };
89-
libraryCppFile = "libmonero-cpp.so";
86+
libraryFiles = new String[] { "libmonero-java.so" };
9087
libraryJavaFile = "libmonero-java.so";
9188
} else if (osName.contains("mac")) {
9289
libraryPath += osArch.contains("aarch64") ? "mac-arm64/" : "mac-x86_64/";
93-
libraryFiles = new String[] { "libmonero-cpp.dylib", "libmonero-java.dylib" };
94-
libraryCppFile = "libmonero-cpp.dylib";
90+
libraryFiles = new String[] { "libmonero-java.dylib" };
9591
libraryJavaFile = "libmonero-java.dylib";
9692
} else {
9793
throw new MoneroError("Unsupported operating system: " + osName);
@@ -111,7 +107,6 @@ public static void loadNativeLibrary() {
111107
}
112108

113109
// load native libraries
114-
System.load(tempDir.resolve(libraryCppFile).toString());
115110
System.load(tempDir.resolve(libraryJavaFile).toString());
116111
} catch (Exception | UnsatisfiedLinkError e) {
117112
throw new MoneroError(e);

0 commit comments

Comments
 (0)