Add wip android/ios lib builds

This commit is contained in:
Ethan O'Brien
2025-11-30 11:55:22 -06:00
parent 9a072823a0
commit d4a5f0dd11
8 changed files with 358 additions and 1 deletions

60
src/android.rs Normal file
View File

@@ -0,0 +1,60 @@
use jni::JNIEnv;
use jni::objects::{JClass};
use jni::sys::{jstring, jboolean};
use std::thread;
use jni::objects::JString;
use crate::{run_server, stop_server};
use std::os::raw::c_char;
#[link(name = "c_code", kind = "static")]
unsafe extern "C" {
pub fn android_log(tag: *const c_char, message: *const c_char);
}
#[macro_export]
macro_rules! log_to_logcat {
($tag:expr, $($arg:tt)*) => {
let log_message = format!($($arg)*);
let _ = std::panic::catch_unwind(|| {
let tag = std::ffi::CString::new($tag).unwrap();
let message = std::ffi::CString::new(log_message).unwrap();
unsafe {
crate::android::android_log(tag.as_ptr(), message.as_ptr());
}
});
};
}
#[unsafe(no_mangle)]
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_startServer<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
data_path: JString<'local>,
easter: jboolean
) -> jstring {
//crate::runtime::set_easter_mode(easter != 0);
let data_path: String = env.get_string(&data_path).unwrap().into();
//crate::runtime::set_datapath(data_path);
let output = env.new_string(String::from("Azunyannnn~")).unwrap();
thread::spawn(|| {
run_server(true).unwrap();
});
log_to_logcat!("ew", "running");
output.into_raw()
}
#[unsafe(no_mangle)]
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_stopServer<'local>(env: JNIEnv<'local>, _class: JClass<'local>) -> jstring {
stop_server();
let output = env.new_string(String::from("I like Yui!")).unwrap();
output.into_raw()
}
#[unsafe(no_mangle)]
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_setEasterMode<'local>(_env: JNIEnv<'local>, _class: JClass<'local>, easter: jboolean) {
//crate::runtime::set_easter_mode(easter != 0);
}

27
src/ios.rs Normal file
View File

@@ -0,0 +1,27 @@
#[cfg(target_os = "ios")]
#[unsafe(no_mangle)]
#[unsafe(link_section = "__DATA,__mod_init_func")]
pub static INITIALIZER: extern "C" fn() = main;
#[cfg(target_os = "ios")]
#[unsafe(no_mangle)]
pub extern "C" fn main() {
let data_path = get_bundle_path().into_os_string().into_string().unwrap();
android::set_datapath(data_path);
std::thread::spawn(|| {
run_server(true).unwrap();
});
}
#[cfg(target_os = "ios")]
use objc2_foundation::{NSFileManager, NSSearchPathDirectory, NSSearchPathDomainMask};
#[cfg(target_os = "ios")]
fn get_bundle_path() -> std::path::PathBuf {
unsafe {
let manager = NSFileManager::defaultManager();
let application_support = manager.URLsForDirectory_inDomains(NSSearchPathDirectory::ApplicationSupportDirectory, NSSearchPathDomainMask::UserDomainMask);
return application_support.to_vec_unchecked()[0].to_file_path().unwrap();
}
}

View File

@@ -7,6 +7,14 @@ mod runtime;
#[macro_use]
mod macros;
#[cfg(feature = "library")]
#[cfg(target_os = "android")]
mod android;
#[cfg(feature = "library")]
#[cfg(target_os = "ios")]
mod ios;
use actix_web::{
rt,
App,
@@ -66,7 +74,7 @@ pub async fn run_server(in_thread: bool) -> std::io::Result<()> {
}
#[actix_web::main]
async fn stop_server() {
pub async fn stop_server() {
runtime::set_running(false);
println!("Stopping");
}

7
src/log.c Normal file
View File

@@ -0,0 +1,7 @@
#include <android/log.h>
#define LOGI(tag, ...) __android_log_print(ANDROID_LOG_INFO, tag, __VA_ARGS__)
void android_log(const char* tag, const char* out) {
LOGI(tag, "%s", out);
}

View File

@@ -1,4 +1,10 @@
#[cfg(not(feature = "library"))]
fn main() -> std::io::Result<()> {
ew::run_server(false)
}
#[cfg(feature = "library")]
fn main() {
panic!("Compiled with the library feature! You should load the shared object library and call the exported methods there.");
}