Add docker generate builds wasm & android native (#17)

* Generate Builds

* Generate Android builds

* Last commit
This commit is contained in:
KoalaSat
2024-04-30 01:29:36 +02:00
committed by GitHub
parent 40982cb637
commit 424a297c30
12 changed files with 1810 additions and 6 deletions

5
.cargo/config.toml Normal file
View File

@ -0,0 +1,5 @@
[target.aarch64-linux-android]
linker = "/opt/android-sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang"
[target.armv7-linux-androideabi]
linker = "/opt/android-sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi30-clang"

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
/builds
/target
/Cargo.lock

1576
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,4 @@
[workspace]
members = [
"robohash",
"robonames",

78
Dockerfile Normal file
View File

@ -0,0 +1,78 @@
FROM debian:testing-slim AS base
# install common packages
RUN apt-get update \
&& apt-get install -y \
wget \
curl \
unzip \
build-essential \
openjdk-17-jre-headless \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# Set an environment variable for convenience.
ENV GRADLE_ROOT=${HOME}/opt/gradle
RUN mkdir -p ${GRADLE_ROOT}
RUN wget https://services.gradle.org/distributions/gradle-7.5.1-bin.zip -O gradle-7.5.1-bin.zip \
&& sha256sum gradle-7.5.1-bin.zip \
&& echo "f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 gradle-7.5.1-bin.zip" | sha256sum -c - \
&& unzip gradle-7.5.1-bin.zip -d ${GRADLE_ROOT} \
&& rm gradle-7.5.1-bin.zip
# Add the relevant directories to the $PATH.
ENV PATH=${PATH}:${GRADLE_ROOT}/gradle-7.5.1/bin
# Set the ${ANDROID_HOME} variable, so that the tools can find our installation.
# See https://developer.android.com/studio/command-line/variables#envar.
ENV ANDROID_HOME=${HOME}/opt/android-sdk
# Download and extract the command-line tools into ${ANDROID_HOME}.
RUN mkdir -p ${ANDROID_HOME}
RUN wget https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip \
-O commandlinetools-linux-8512546_latest.zip \
&& sha256sum commandlinetools-linux-8512546_latest.zip \
&& echo "2ccbda4302db862a28ada25aa7425d99dce9462046003c1714b059b5c47970d8 commandlinetools-linux-8512546_latest.zip" | sha256sum -c - \
&& unzip commandlinetools-linux-8512546_latest.zip -d ${ANDROID_HOME}/cmdline-tools \
&& rm commandlinetools-linux-8512546_latest.zip
# Add the relevant directories to the $PATH.
ENV PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/cmdline-tools/bin:${ANDROID_HOME}/platform-tools
RUN yes | sdkmanager --licenses \
&& sdkmanager --verbose \
"build-tools;30.0.3" \
"ndk;25.1.8937393" \
"platforms;android-33"
ENV NDK_HOME=${ANDROID_HOME}/ndk/25.1.8937393
# install rust tools
RUN curl https://sh.rustup.rs -sSf | \
sh -s -- --default-toolchain nightly -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN rustup target add \
aarch64-linux-android \
armv7-linux-androideabi \
&& rustup toolchain install nightly \
&& rustup target add --toolchain nightly \
aarch64-linux-android \
armv7-linux-androideabi
ENV PATH="${PATH}:${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
# install cargo tools
RUN cargo install cargo-ndk
COPY . /root
# Robonames
FROM base AS robonames
WORKDIR /root/robonames
# Robohash
FROM base AS robohash
WORKDIR /root/robohash

View File

@ -3,3 +3,11 @@
Crates to generate robot identities from a hex hash string. Implements the RoboSats nickname generator and the [RoboHash](https://github.com/e1ven/Robohash/) profile images by [e1ven](https://github.com/e1ven) and [kyco](https://github.com/kyco/robohash).
The goal is to build a compact WASM capable of generating robot avatars in the web frontend.
### 🛠️ Build libraries
```
docker-compose up
```
Once the build process is done, you will find all libraries under the `./builds` folder.

26
docker-compose.yml Normal file
View File

@ -0,0 +1,26 @@
version: '3.4'
services:
rust_wasm:
build:
context: .
dockerfile: ./robo-identities-wasm/Dockerfile
volumes:
- ./builds/wasm/:/app/robo-identities-wasm/pkg/:rw
command: wasm-pack build
rust_java_robonames:
build:
context: .
dockerfile: ./Dockerfile
target: robonames
volumes:
- ./builds/java/robonames:/root/target/:rw
command: cargo ndk -t armeabi-v7a -t arm64-v8a -o ./target build --release
rust_java_robohash:
build:
context: .
dockerfile: ./Dockerfile
target: robohash
volumes:
- ./builds/java/robohash:/root/target/:rw
command: cargo ndk -t armeabi-v7a -t arm64-v8a -o ./target build --release

View File

@ -0,0 +1,22 @@
FROM debian:testing-slim
# install common packages
RUN apt-get update && \
apt-get install --no-install-recommends -y \
ca-certificates curl file \
build-essential \
autoconf automake autotools-dev libtool xutils-dev && \
rm -rf /var/lib/apt/lists/*
# install Rust toolchain
RUN curl https://sh.rustup.rs -sSf | \
sh -s -- --default-toolchain nightly -y
ENV PATH="/root/.cargo/bin:${PATH}"
# install depdendencies
RUN cargo install wasm-pack
COPY . /app
WORKDIR /app/robo-identities-wasm

View File

@ -18,6 +18,7 @@ path = "src/main.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
jni = "0.21.1"
ring = "0.16.20"
anyhow = "1.0.66"
data-encoding = "2.3.2"
@ -29,6 +30,7 @@ strum = "0.25"
strum_macros = "0.25"
thiserror = "1.0.37"
imageproc = "0.23.0"
prefer-dynamic = "0"
[dev-dependencies]
criterion = { version = "0.5.1", features = ["html_reports"] }
@ -36,3 +38,6 @@ criterion = { version = "0.5.1", features = ["html_reports"] }
[[bench]]
name = "benchmark"
harness = false
[lib]
crate-type = ["rlib", "dylib"]

View File

@ -126,6 +126,55 @@ fn select_hue_rotation(hash_array: &[i64]) -> Option<i32> {
Some(hue)
}
pub mod android {
use jni::objects::{JClass, JString};
use jni::sys::jstring;
use jni::JNIEnv;
use crate::RoboHashBuilder;
#[no_mangle]
pub extern "system" fn Java_com_robosats_RoboIdentities_nativeGenerateRobohash<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
initial_string: JString<'local>,
) -> jstring {
let initial_string: String = env
.get_string(&initial_string)
.expect("Couldn't get java string!")
.into();
match initial_string.split_once(';') {
Some((hash, size_str)) => {
match size_str.parse::<u32>() {
Ok(size) => {
let robohash = RoboHashBuilder::new(hash)
.with_background(&true)
.with_size(size as u32, size as u32)
.build();
match robohash {
Ok(robo) => match robo.assemble_base64() {
Ok(base64_string) => {
let output = env
.new_string(base64_string)
.expect("Couldn't create java string!");
output.into_raw()
}
Err(_text) => todo!(),
},
Err(_text) => todo!(),
}
}
Err(_err) => todo!(),
}
}
None => todo!(),
}
}
}
#[cfg(test)]
mod tests {
use std::fs::File;

View File

@ -6,7 +6,12 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
jni = "0.21.1"
data-encoding = "2.4.0"
num = "0.4.1"
ring = "0.16.20"
sha2 = "0.10.1"
prefer-dynamic = "0"
[lib]
crate-type = ["rlib", "dylib"]

View File

@ -86,6 +86,37 @@ pub fn generate_short_nickname(hex_str: &str) -> Result<String, Error> {
Ok(String::from(""))
}
pub mod android {
use jni::objects::{JClass, JString};
use jni::sys::jstring;
use jni::JNIEnv;
use crate::generate_short_nickname;
#[no_mangle]
pub extern "system" fn Java_com_robosats_RoboIdentities_nativeGenerateRoboname<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
initial_string: JString<'local>,
) -> jstring {
let initial_string: String = env
.get_string(&initial_string)
.expect("Couldn't get java string!")
.into();
let string: &str = initial_string.as_str();
let nickname = generate_short_nickname(string);
match nickname {
Ok(nick) => {
let output = env.new_string(nick).expect("Couldn't create java string!");
// Finally, extract the raw pointer to return.
output.into_raw()
}
Err(_) => todo!(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;