From 5cefa10faa9b9abd115e12048acff60ce03ac814 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 29 Apr 2022 00:03:11 +0200 Subject: [PATCH] Update build instructions for future android app release --- .cargo/config.toml | 15 +++++++++++++++ Cargo.toml | 12 +++++++++--- Makefile | 24 ++++++++++++++++++++++++ num-string/Cargo.toml | 14 ++++++++++++++ src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 Makefile create mode 100644 num-string/Cargo.toml create mode 100644 src/lib.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..1354a95 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,15 @@ +[target.aarch64-linux-android] +linker = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android32-clang" +ar = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android32-ar" +# target-dir = "../app/src/main/jniLibs/arm64-v8a" + +[target.armv7-linux-androideabi] +linker = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-clang" +ar = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar" +# target-dir = "../app/src/main/jniLibs/armeabi-v7a" + +[target.i686-linux-android] +linker = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-clang" +ar = "/home/adri/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-ar" +# target-dir = "../app/src/main/jniLibs/x86" + diff --git a/Cargo.toml b/Cargo.toml index 0128f08..76b4c06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,11 @@ [package] +name = "num-string" +version = "2.1.0" edition = "2021" -name = "numstr" -version = "0.1.0" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "num_string" +crate-type = ["dylib"] [dependencies] clap = {version = "3.1.12", features = ["derive"]} @@ -12,3 +14,7 @@ clipboard = "0.5.0" [target.'cfg(not(target_os = "android"))'.dependencies] gtk4 = "0.4.7" + +[target.'cfg(target_os="android")'.dependencies] +jni = { version = "0.5", default-features = false } + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4574d3b --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +ANDROID_NDK_HOME = $(HOME)/Android/Sdk/ndk +GENERATED_V8A = target/aarch64-linux-android/debug/libnum_string.so +GENERATED_V7A = target/armv7-linux-androideabi/debug/libnum_string.so +GENERATED_X86 = target/i686-linux-android/debug/libnum_string.so + +all: dirs arm64-v8a armv7-v7a x86 + +dirs: + rm -r ../app/src/main/jniLibs + mkdir -p ../app/src/main/jniLibs/{arm64-v8a,armeabi-v7a,x86} + +arm64-v8a: + ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) cargo +nightly ndk -t arm64-v8a build -Zbuild-std + cp $(GENERATED_V8A) ../app/src/main/jniLibs/arm64-v8a + +armv7-v7a: + ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) cargo +nightly ndk -t armeabi-v7a build -Zbuild-std + cp $(GENERATED_V7A) ../app/src/main/jniLibs/armeabi-v7a + +x86: + ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) cargo +nightly ndk -t x86 build -Zbuild-std + cp $(GENERATED_X86) ../app/src/main/jniLibs/x86 + + diff --git a/num-string/Cargo.toml b/num-string/Cargo.toml new file mode 100644 index 0000000..0128f08 --- /dev/null +++ b/num-string/Cargo.toml @@ -0,0 +1,14 @@ +[package] +edition = "2021" +name = "numstr" +version = "0.1.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = {version = "3.1.12", features = ["derive"]} +sscanf = "0.2.1" +clipboard = "0.5.0" + +[target.'cfg(not(target_os = "android"))'.dependencies] +gtk4 = "0.4.7" diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..81320a2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,35 @@ +use std::os::raw::{c_char}; +use std::ffi::{CString, CStr}; + +#[no_mangle] +pub extern fn rust_greeting(to: *const c_char) -> *mut c_char { + let c_str = unsafe { CStr::from_ptr(to) }; + let recipient = match c_str.to_str() { + Err(_) => "there", + Ok(string) => string, + }; + + CString::new("Hello ".to_owned() + recipient).unwrap().into_raw() +} + +#[cfg(target_os="android")] +#[allow(non_snake_case)] +pub mod android { + extern crate jni; + + use super::*; + use self::jni::JNIEnv; + use self::jni::objects::{JClass, JString}; + use self::jni::sys::{jstring}; + + #[no_mangle] + pub unsafe extern fn Java_com_tdb_numstring_MainActivity_greeting(env: JNIEnv, _: JClass, java_pattern: JString) -> jstring { + // Our Java companion code might pass-in "world" as a string, hence the name. + let world = rust_greeting(env.get_string(java_pattern).expect("invalid pattern string").as_ptr()); + // Retake pointer so that we can use it below and allow memory to be freed when it goes out of scope. + let world_ptr = CString::from_raw(world); + let output = env.new_string(world_ptr.to_str().unwrap()).expect("Couldn't create java string!"); + + output.into_inner() + } +}