我可以编写可以在WebAssembly、Android和iOS上运行的代码吗?
是否可以编写通用源代码,同时作为WebAssembly、Android和iOS的本机库运行?是的,这是可能的,我创建了一篇推荐文章/想法来改进它 我在我可以编写可以在WebAssembly、Android和iOS上运行的代码吗?,android,ios,rust,webassembly,Android,Ios,Rust,Webassembly,是否可以编写通用源代码,同时作为WebAssembly、Android和iOS的本机库运行?是的,这是可能的,我创建了一篇推荐文章/想法来改进它 我在wasm和android上测试的代码是: src文件夹树: Hasans-Air:src h_ajsf$ tree . . ├── lib.rs ├── android │ └── mod.rs ├── ios │ └── mod.rs └── wasm └── mod.rs 3 directories, 4 files 现在的
wasm
和android
上测试的代码是:
src文件夹树:
Hasans-Air:src h_ajsf$ tree .
.
├── lib.rs
├── android
│ └── mod.rs
├── ios
│ └── mod.rs
└── wasm
└── mod.rs
3 directories, 4 files
现在的文件是:
主要内容:
瓦斯姆
安卓
// android/mod.rs
#[cfg(target_os="android")]
#[allow(non_snake_case)]
pub mod android {
use crate::rust_greetings;
use crate::char_str;
extern crate jni;
use self::jni::JNIEnv;
use self::jni::objects::{JClass, JString};
use self::jni::sys::{jstring};
#[no_mangle]
pub unsafe extern fn Java_com_hasan_RustGreetings_greetings(env: JNIEnv, _: JClass, java_pattern: JString) -> jstring {
let jvm_input = env.get_string(java_pattern)
.expect("invalid pattern string").as_ptr();
let input = rust_greetings(char_str(jvm_input));
let output = env.new_string(input)
.expect("Couldn't create java string!");
output.into_inner()
}
}
iOS
汤姆
这不仅仅是编写在所有三个平台上运行的一段代码。它编写一段代码,然后为该代码编写3个适配器,为每个平台定制。
// wasm/mod.rs
#[cfg(target_arch = "wasm32")]
pub mod wasm {
use crate::rust_greetings;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn wasm_greetings(to: &str) -> String {
rust_greetings(to)
}
}
// android/mod.rs
#[cfg(target_os="android")]
#[allow(non_snake_case)]
pub mod android {
use crate::rust_greetings;
use crate::char_str;
extern crate jni;
use self::jni::JNIEnv;
use self::jni::objects::{JClass, JString};
use self::jni::sys::{jstring};
#[no_mangle]
pub unsafe extern fn Java_com_hasan_RustGreetings_greetings(env: JNIEnv, _: JClass, java_pattern: JString) -> jstring {
let jvm_input = env.get_string(java_pattern)
.expect("invalid pattern string").as_ptr();
let input = rust_greetings(char_str(jvm_input));
let output = env.new_string(input)
.expect("Couldn't create java string!");
output.into_inner()
}
}
// ios/mod.rs
#[cfg(target_os="ios")]
#[no_mangle]
pub mod ios {
use crate::char_str;
use std::ffi::{CString, CStr};
use std::os::raw::{c_char};
use crate::rust_greetings;
#[no_mangle]
pub extern fn ios_greetings(to: *const c_char) -> *mut c_char {
let input = rust_greetings(char_str(to));
CString::new(input).unwrap().into_raw()
}
pub extern fn iso_greeting_free(s: *mut c_char) {
unsafe {
if s.is_null() { return }
CString::from_raw(s)
};
}
}
# Cargo.toml
[package]
name = "greetings"
version = "0.1.0"
authors = ["Hasan Yousef"]
edition = "2018"
[dependencies]
[target.'cfg(target_arch="wasm32")'.dependencies]
wasm-bindgen = "0.2.29"
[target.'cfg(target_os="android")'.dependencies]
jni = { version = "0.5", default-features = false }
[lib]
name = "rust_greetings"
crate-type = ["cdylib", "dylib", "staticlib"]
# Android: dylib
# iOS: cdylib [armv7s-apple-ios] and staticlib [Others]
# WASM: cdylib