Skip to content

Commit 1cc14ff

Browse files
authored
Add jvm support and github actions #3
Also fix 16kb alignment for Android
2 parents b79b40f + 8bc5dd9 commit 1cc14ff

16 files changed

Lines changed: 487 additions & 36 deletions

File tree

.github/workflows/build.yml

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: ['**']
6+
tags: ['v*']
7+
pull_request:
8+
workflow_dispatch:
9+
10+
jobs:
11+
# ---------- Native builds ----------
12+
13+
android-native:
14+
name: android/${{ matrix.abi }}
15+
runs-on: ubuntu-latest
16+
strategy:
17+
fail-fast: false
18+
matrix:
19+
include:
20+
- abi: armeabi-v7a
21+
target: armv7-linux-androideabi
22+
cc: armv7a-linux-androideabi16-clang
23+
- abi: arm64-v8a
24+
target: aarch64-linux-android
25+
cc: aarch64-linux-android21-clang
26+
- abi: x86
27+
target: i686-linux-android
28+
cc: i686-linux-android16-clang
29+
- abi: x86_64
30+
target: x86_64-linux-android
31+
cc: x86_64-linux-android21-clang
32+
steps:
33+
- uses: actions/checkout@v4
34+
35+
- uses: actions-rust-lang/setup-rust-toolchain@v1
36+
with:
37+
target: ${{ matrix.target }}
38+
cache-key: android-${{ matrix.target }}
39+
rustflags: ""
40+
41+
- name: Install pinned Android NDK
42+
run: echo y | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "ndk;21.3.6528147"
43+
44+
- name: Put NDK toolchain on PATH
45+
run: echo "$ANDROID_HOME/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin" >> $GITHUB_PATH
46+
47+
- name: Build
48+
env:
49+
CC: ${{ matrix.cc }}
50+
run: |
51+
triple_upper=$(echo "${{ matrix.target }}" | tr 'a-z-' 'A-Z_')
52+
export "CARGO_TARGET_${triple_upper}_LINKER=${{ matrix.cc }}"
53+
mkdir -p "$RUNNER_TEMP/libunwind-stub"
54+
printf '!<arch>\n' > "$RUNNER_TEMP/libunwind-stub/libunwind.a"
55+
export RUSTFLAGS="-L $RUNNER_TEMP/libunwind-stub -C link-arg=-Wl,-z,max-page-size=16384"
56+
cargo build --target ${{ matrix.target }} --release
57+
58+
- name: Upload native lib
59+
uses: actions/upload-artifact@v4
60+
with:
61+
name: android-${{ matrix.abi }}
62+
path: target/${{ matrix.target }}/release/libetebase_jni.so
63+
if-no-files-found: error
64+
65+
- name: Upload generated Java (once)
66+
if: matrix.abi == 'arm64-v8a'
67+
uses: actions/upload-artifact@v4
68+
with:
69+
name: android-generated-java
70+
path: client/src/main/java/com/etebase/client/*.java
71+
if-no-files-found: error
72+
73+
desktop-native:
74+
name: desktop/${{ matrix.subdir }}
75+
runs-on: ${{ matrix.runner }}
76+
strategy:
77+
fail-fast: false
78+
matrix:
79+
include:
80+
- runner: macos-latest
81+
subdir: macos-aarch64
82+
target: aarch64-apple-darwin
83+
libfile: libetebase_jni.dylib
84+
- runner: macos-latest
85+
subdir: macos-x86_64
86+
target: x86_64-apple-darwin
87+
libfile: libetebase_jni.dylib
88+
- runner: ubuntu-22.04
89+
subdir: linux-x86_64
90+
target: x86_64-unknown-linux-gnu
91+
libfile: libetebase_jni.so
92+
- runner: ubuntu-22.04-arm
93+
subdir: linux-aarch64
94+
target: aarch64-unknown-linux-gnu
95+
libfile: libetebase_jni.so
96+
- runner: windows-latest
97+
subdir: windows-x86_64
98+
target: x86_64-pc-windows-msvc
99+
libfile: etebase_jni.dll
100+
steps:
101+
- uses: actions/checkout@v4
102+
103+
- uses: actions-rust-lang/setup-rust-toolchain@v1
104+
with:
105+
target: ${{ matrix.target }}
106+
cache-key: desktop-${{ matrix.target }}
107+
rustflags: ""
108+
109+
- name: Build
110+
shell: bash
111+
run: cargo build --target ${{ matrix.target }} --release --no-default-features --features jvm
112+
113+
- name: Upload native lib
114+
uses: actions/upload-artifact@v4
115+
with:
116+
name: desktop-${{ matrix.subdir }}
117+
path: target/${{ matrix.target }}/release/${{ matrix.libfile }}
118+
if-no-files-found: error
119+
120+
- name: Upload generated Java (once)
121+
if: matrix.subdir == 'linux-x86_64'
122+
uses: actions/upload-artifact@v4
123+
with:
124+
name: desktop-generated-java
125+
path: client-jvm/src/main/java/com/etebase/client/*.java
126+
if-no-files-found: error
127+
128+
# ---------- Assembly ----------
129+
130+
assemble-android:
131+
name: Assemble AAR
132+
needs: android-native
133+
runs-on: ubuntu-latest
134+
steps:
135+
- uses: actions/checkout@v4
136+
137+
- uses: actions/setup-java@v4
138+
with:
139+
distribution: temurin
140+
java-version: '11'
141+
142+
- name: Install pinned Android NDK
143+
run: echo y | JAVA_HOME="$JAVA_HOME_17_X64" $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "ndk;21.3.6528147"
144+
145+
- name: Download native libs
146+
uses: actions/download-artifact@v4
147+
with:
148+
pattern: android-*
149+
path: artifacts/
150+
151+
- name: Stage jniLibs and generated Java
152+
run: |
153+
for abi in armeabi-v7a arm64-v8a x86 x86_64; do
154+
mkdir -p client/src/main/jniLibs/$abi
155+
cp artifacts/android-$abi/libetebase_jni.so client/src/main/jniLibs/$abi/
156+
done
157+
mkdir -p client/src/main/java/com/etebase/client
158+
cp artifacts/android-generated-java/*.java client/src/main/java/com/etebase/client/
159+
160+
- name: Assemble AAR
161+
run: ./gradlew :client:assembleRelease --no-daemon
162+
163+
- name: Upload AAR
164+
uses: actions/upload-artifact@v4
165+
with:
166+
name: etebase-client-aar
167+
path: client/build/outputs/aar/*.aar
168+
if-no-files-found: error
169+
170+
assemble-jvm:
171+
name: Assemble JAR
172+
needs: desktop-native
173+
runs-on: ubuntu-latest
174+
steps:
175+
- uses: actions/checkout@v4
176+
177+
- uses: actions/setup-java@v4
178+
with:
179+
distribution: temurin
180+
java-version: '11'
181+
182+
- name: Download native libs
183+
uses: actions/download-artifact@v4
184+
with:
185+
pattern: desktop-*
186+
path: artifacts/
187+
188+
- name: Stage native libs and generated Java
189+
run: |
190+
for subdir in macos-aarch64 macos-x86_64 linux-x86_64 linux-aarch64 windows-x86_64; do
191+
mkdir -p client-jvm/src/main/resources/com/etebase/client/native/$subdir
192+
cp artifacts/desktop-$subdir/* client-jvm/src/main/resources/com/etebase/client/native/$subdir/
193+
done
194+
mkdir -p client-jvm/src/main/java/com/etebase/client
195+
cp artifacts/desktop-generated-java/*.java client-jvm/src/main/java/com/etebase/client/
196+
197+
- name: Assemble JAR
198+
run: ./gradlew :client-jvm:assemble --no-daemon
199+
200+
- name: Upload JAR
201+
uses: actions/upload-artifact@v4
202+
with:
203+
name: etebase-client-jvm-jar
204+
path: client-jvm/build/libs/*.jar
205+
if-no-files-found: error

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/.idea/assetWizardSettings.xml
1010
.DS_Store
1111
/build
12+
/client-jvm/build/
1213
/captures
1314
.externalNativeBuild
1415
.cxx
@@ -19,3 +20,6 @@
1920
/target
2021
/client/src/main/jniLibs
2122
/client/src/main/java/com/etebase/client/*.java
23+
/client-jvm/src/main/java/com/etebase/client/*.java
24+
/client-jvm/src/main/resources/com/etebase/client/native
25+

Cargo.lock

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
2-
name = "etebase-android"
3-
description = "Android bindings to etebase-rs"
2+
name = "etebase-jni"
3+
description = "JNI bindings to etebase-rs (Android and desktop JVM)"
44
homepage = "https://www.etebase.com"
55
repository = "https://github.com/etesync/etebase-java"
66
version = "2.3.1"
@@ -18,12 +18,13 @@ env_logger = "^0.7"
1818

1919
[dependencies]
2020
log = "0.4.6"
21-
log-panics = "2.0"
22-
android_logger = "0.8"
21+
log-panics = { version = "2.0", optional = true }
22+
android_logger = { version = "0.8", optional = true }
2323
jni-sys = "0.3.0"
2424
etebase = { git = "https://github.com/etesync/etebase-rs", rev = "ff14aadd7d5bdefee084e8266f0d2642ed268834", default-features = false }
2525

2626

2727
[features]
2828
default = ["android"]
29-
android = []
29+
android = ["android_logger", "log-panics"]
30+
jvm = []

build.gradle

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
buildscript {
33
repositories {
44
google()
5-
jcenter()
5+
mavenCentral()
66
}
77
dependencies {
88
classpath "com.android.tools.build:gradle:4.0.0"
@@ -15,10 +15,13 @@ buildscript {
1515
allprojects {
1616
repositories {
1717
google()
18-
jcenter()
18+
mavenCentral()
1919
}
20+
group = "com.etebase"
21+
version = "2.3.2"
22+
ext.isSnapshot = version.endsWith("SNAPSHOT")
2023
}
2124

2225
task clean(type: Delete) {
2326
delete rootProject.buildDir
24-
}
27+
}

build.rs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,40 @@
11
use flapigen::{JavaConfig, LanguageConfig};
2-
use std::{env, path::Path};
2+
use std::{env, path::{Path, PathBuf}};
33

44
fn main() {
55
env_logger::init();
6+
7+
let android = env::var_os("CARGO_FEATURE_ANDROID").is_some();
8+
let jvm = env::var_os("CARGO_FEATURE_JVM").is_some();
9+
if android && jvm {
10+
panic!("The `android` and `jvm` features are mutually exclusive");
11+
}
12+
613
let out_dir = env::var("OUT_DIR").unwrap();
714
let in_src = Path::new("src").join("java_glue.rs.in");
815
let out_src = Path::new(&out_dir).join("java_glue.rs");
9-
//ANCHOR: config
16+
17+
let (java_module, annotation_pkg): (PathBuf, &str) = if jvm {
18+
(PathBuf::from("client-jvm"), "com.etebase.client.annotation")
19+
} else {
20+
(PathBuf::from("client"), "androidx.annotation")
21+
};
22+
23+
let java_out = java_module
24+
.join("src")
25+
.join("main")
26+
.join("java")
27+
.join("com")
28+
.join("etebase")
29+
.join("client");
30+
1031
let swig_gen = flapigen::Generator::new(LanguageConfig::JavaConfig(
11-
JavaConfig::new(
12-
Path::new("client")
13-
.join("src")
14-
.join("main")
15-
.join("java")
16-
.join("com")
17-
.join("etebase")
18-
.join("client"),
19-
"com.etebase.client".into(),
20-
)
21-
.use_null_annotation_from_package("androidx.annotation".into()),
32+
JavaConfig::new(java_out, "com.etebase.client".into())
33+
.use_null_annotation_from_package(annotation_pkg.into()),
2234
))
2335
.merge_type_map("typemaps", include_str!("src/jni_typemaps.rs"))
2436
.remove_not_generated_files_from_output_directory(true)
2537
.rustfmt_bindings(true);
26-
//ANCHOR_END: config
27-
swig_gen.expand("android bindings", &in_src, &out_src);
38+
swig_gen.expand("etebase jni bindings", &in_src, &out_src);
2839
println!("cargo:rerun-if-changed={}", in_src.display());
2940
}

build.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ do
2929
cargo build --target ${target} --release
3030

3131
mkdir -p "$jniDir"
32-
cp "target/$target/release/libetebase_android.so" "$jniDir"
32+
cp "target/$target/release/libetebase_jni.so" "$jniDir"
3333
done
3434

35-
./gradlew clean build
35+
./gradlew clean :client:build

0 commit comments

Comments
 (0)