mirror of
https://git.ethanthesleepy.one/ethanaobrien/ew
synced 2026-01-12 08:12:36 +08:00
Add wip android/ios lib builds
This commit is contained in:
60
src/android.rs
Normal file
60
src/android.rs
Normal 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
27
src/ios.rs
Normal 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();
|
||||
}
|
||||
}
|
||||
10
src/lib.rs
10
src/lib.rs
@@ -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
7
src/log.c
Normal 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);
|
||||
}
|
||||
@@ -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.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user