Skip to content

Commit 2589356

Browse files
committed
build: Create script to build java library (w/ jni-utils-rs)
1 parent a8c57e1 commit 2589356

1 file changed

Lines changed: 228 additions & 0 deletions

File tree

scripts/build-java.sh

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
#!/usr/bin/env bash
2+
#
3+
# Build the Java/Android portion of btleplug (src/droidplug/java).
4+
#
5+
# Checks for and installs Java (via Homebrew on macOS) if necessary,
6+
# locates the Android SDK, then runs the Gradle build.
7+
#
8+
set -euo pipefail
9+
10+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
11+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
12+
JAVA_DIR="$PROJECT_ROOT/src/droidplug/java"
13+
14+
# --- Colors (if terminal) ---------------------------------------------------
15+
if [ -t 1 ]; then
16+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[0;33m'; NC='\033[0m'
17+
else
18+
RED=''; GREEN=''; YELLOW=''; NC=''
19+
fi
20+
21+
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
22+
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
23+
error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
24+
die() { error "$@"; exit 1; }
25+
26+
# --- Detect OS ---------------------------------------------------------------
27+
OS="$(uname -s)"
28+
29+
# --- Java --------------------------------------------------------------------
30+
ensure_java() {
31+
if command -v java &>/dev/null && java -version &>/dev/null 2>&1; then
32+
local ver
33+
ver="$(java -version 2>&1 | head -1 | sed -E 's/.*"([0-9]+).*/\1/')"
34+
if [ "$ver" -ge 11 ] 2>/dev/null; then
35+
info "Java $ver found: $(command -v java)"
36+
return 0
37+
else
38+
warn "Java $ver found but AGP 7.4 requires Java >= 11"
39+
fi
40+
fi
41+
42+
info "Java not found or too old — attempting to install..."
43+
44+
case "$OS" in
45+
Darwin)
46+
if ! command -v brew &>/dev/null; then
47+
die "Homebrew not found. Install it from https://brew.sh or install Java 11+ manually."
48+
fi
49+
info "Installing openjdk@17 via Homebrew..."
50+
brew install openjdk@17
51+
# Homebrew installs openjdk to its prefix; create the system symlink
52+
# so /usr/libexec/java_home can find it. This may fail without sudo
53+
# but we can still use it directly via JAVA_HOME.
54+
local jdk_path
55+
jdk_path="$(brew --prefix openjdk@17)/libexec/openjdk.jdk/Contents/Home"
56+
if [ -d "$jdk_path" ]; then
57+
export JAVA_HOME="$jdk_path"
58+
export PATH="$JAVA_HOME/bin:$PATH"
59+
else
60+
die "openjdk@17 installed but JDK home not found at expected path."
61+
fi
62+
;;
63+
Linux)
64+
if command -v apt-get &>/dev/null; then
65+
info "Installing openjdk-17-jdk via apt..."
66+
sudo apt-get update -qq && sudo apt-get install -y -qq openjdk-17-jdk
67+
elif command -v dnf &>/dev/null; then
68+
info "Installing java-17-openjdk-devel via dnf..."
69+
sudo dnf install -y java-17-openjdk-devel
70+
elif command -v pacman &>/dev/null; then
71+
info "Installing jdk17-openjdk via pacman..."
72+
sudo pacman -S --noconfirm jdk17-openjdk
73+
else
74+
die "Could not detect package manager. Install Java 11+ manually."
75+
fi
76+
;;
77+
*)
78+
die "Unsupported OS '$OS'. Install Java 11+ manually."
79+
;;
80+
esac
81+
82+
# Verify
83+
if ! command -v java &>/dev/null || ! java -version &>/dev/null 2>&1; then
84+
die "Java installation failed or 'java' is not on PATH."
85+
fi
86+
info "Java installed successfully."
87+
}
88+
89+
# --- JAVA_HOME ---------------------------------------------------------------
90+
ensure_java_home() {
91+
if [ -n "${JAVA_HOME:-}" ] && [ -d "$JAVA_HOME" ]; then
92+
return 0
93+
fi
94+
95+
case "$OS" in
96+
Darwin)
97+
JAVA_HOME="$(/usr/libexec/java_home 2>/dev/null || true)"
98+
# Fallback: check Homebrew openjdk directly
99+
if [ -z "${JAVA_HOME:-}" ] || [ ! -d "${JAVA_HOME:-}" ]; then
100+
for v in 17 21 11; do
101+
local brew_jdk
102+
brew_jdk="$(brew --prefix "openjdk@$v" 2>/dev/null || true)"
103+
if [ -n "$brew_jdk" ] && [ -d "$brew_jdk/libexec/openjdk.jdk/Contents/Home" ]; then
104+
JAVA_HOME="$brew_jdk/libexec/openjdk.jdk/Contents/Home"
105+
break
106+
fi
107+
done
108+
fi
109+
;;
110+
Linux)
111+
# Common locations
112+
for candidate in \
113+
/usr/lib/jvm/java-17-openjdk-amd64 \
114+
/usr/lib/jvm/java-17-openjdk \
115+
/usr/lib/jvm/java-17 \
116+
/usr/lib/jvm/default-java; do
117+
if [ -d "$candidate" ]; then
118+
JAVA_HOME="$candidate"
119+
break
120+
fi
121+
done
122+
;;
123+
esac
124+
125+
if [ -z "${JAVA_HOME:-}" ]; then
126+
die "Could not determine JAVA_HOME. Set it manually and re-run."
127+
fi
128+
export JAVA_HOME
129+
info "JAVA_HOME=$JAVA_HOME"
130+
}
131+
132+
# --- Android SDK -------------------------------------------------------------
133+
ensure_android_sdk() {
134+
if [ -n "${ANDROID_HOME:-}" ] && [ -d "$ANDROID_HOME" ]; then
135+
info "ANDROID_HOME=$ANDROID_HOME"
136+
return 0
137+
fi
138+
139+
# Check ANDROID_SDK_ROOT (older env var)
140+
if [ -n "${ANDROID_SDK_ROOT:-}" ] && [ -d "$ANDROID_SDK_ROOT" ]; then
141+
export ANDROID_HOME="$ANDROID_SDK_ROOT"
142+
info "ANDROID_HOME=$ANDROID_HOME (from ANDROID_SDK_ROOT)"
143+
return 0
144+
fi
145+
146+
# Common default locations
147+
local candidates=()
148+
case "$OS" in
149+
Darwin) candidates=("$HOME/Library/Android/sdk") ;;
150+
Linux) candidates=("$HOME/Android/Sdk" "$HOME/android-sdk") ;;
151+
esac
152+
153+
for candidate in "${candidates[@]}"; do
154+
if [ -d "$candidate" ]; then
155+
export ANDROID_HOME="$candidate"
156+
info "ANDROID_HOME=$ANDROID_HOME (auto-detected)"
157+
return 0
158+
fi
159+
done
160+
161+
die "Android SDK not found. Set ANDROID_HOME and re-run, or install via Android Studio / sdkmanager."
162+
}
163+
164+
# --- Write local.properties --------------------------------------------------
165+
write_local_properties() {
166+
local props="$JAVA_DIR/local.properties"
167+
# Gradle Android plugin requires sdk.dir in local.properties
168+
echo "sdk.dir=$ANDROID_HOME" > "$props"
169+
info "Wrote $props"
170+
}
171+
172+
# --- jni-utils SNAPSHOT dependency -------------------------------------------
173+
JNI_UTILS_DIR="$PROJECT_ROOT/../jni-utils-rs"
174+
175+
build_jni_utils() {
176+
if [ ! -d "$JNI_UTILS_DIR/java" ]; then
177+
die "jni-utils-rs not found at $JNI_UTILS_DIR" \
178+
"Clone it with: git clone https://github.com/nickelc/jni-utils-rs $JNI_UTILS_DIR"
179+
fi
180+
181+
local jni_java_dir
182+
jni_java_dir="$(cd "$JNI_UTILS_DIR/java" && pwd)"
183+
184+
info "Building jni-utils Java library from $jni_java_dir ..."
185+
186+
if [ ! -x "$jni_java_dir/gradlew" ]; then
187+
chmod +x "$jni_java_dir/gradlew"
188+
fi
189+
190+
(cd "$jni_java_dir" && ./gradlew publishToMavenLocal -q)
191+
192+
# Verify it landed
193+
local snapshot_dir="$HOME/.m2/repository/io/github/gedgygedgy/rust/jni-utils/0.1.1-SNAPSHOT"
194+
if [ ! -d "$snapshot_dir" ]; then
195+
die "jni-utils publishToMavenLocal succeeded but artifact not found in $snapshot_dir"
196+
fi
197+
info "jni-utils 0.1.1-SNAPSHOT published to mavenLocal."
198+
}
199+
200+
# --- Build -------------------------------------------------------------------
201+
run_gradle_build() {
202+
info "Running Gradle build in $JAVA_DIR ..."
203+
cd "$JAVA_DIR"
204+
205+
if [ ! -x ./gradlew ]; then
206+
chmod +x ./gradlew
207+
fi
208+
209+
./gradlew assembleDebug "$@"
210+
211+
info "Java build completed successfully."
212+
}
213+
214+
# --- Main --------------------------------------------------------------------
215+
main() {
216+
info "btleplug Java/Android build"
217+
echo
218+
219+
ensure_java
220+
ensure_java_home
221+
ensure_android_sdk
222+
write_local_properties
223+
build_jni_utils
224+
echo
225+
run_gradle_build "$@"
226+
}
227+
228+
main "$@"

0 commit comments

Comments
 (0)