pip在venv中提示没有ssl模块的解决方法
利用路由器实现锐捷自动拨号上网
路由器:小米4C(Xiaomi Mi Router 4C)
架构:MediaTek MT7628AN ver:1 eco:2 x 1
路由器刷固件
在网上搜寻相关方法,对于小米路由器说是要先刷开发版,再刷openwrt。
后参考 小米路由器4C刷机教程(openwrt),成功刷成openwrt。
Java与Wasm中通过指针与内存传递字符串后出现多余字符
估计是内存申请的时候有一些问题,只需要在需要写入的字符串最后再加一个'\0'
rustc生成wasm文件缩减大小
在使用rustc --target wasm32-unknown-unknown —O src/lib.rs 或 cargo build wasm32-unknown-unknown 生成的wasm文件大小为1.6Mb
添加-C lto 参数后大小仅为232kb
Java与wasm(rust)间字符串传参
前言
在wasmer-java导入函数中提到wasm操作限制较大。我们需要通过导入外部函数去解决一些问题。
截至写文章时,已用wasmer-java中他人维护的分支解决导入函数问题
问题
但是导入的外部函数与wasm(实际上为rust程序)之间参数传递只能使用int, long ,float, double 四种,这是远远不够的。
解决方法
对于一些复杂对象的传递,我们可以考虑使用字符串。但是字符串类型也是不能作为参数直接在Java与wasm中直接传递的,我们需要借助wasmer-java中的Memory类,将字符串直接写入虚拟机内存中,并传递一个 int 类型的指针。
传入字符串
Java
参数初始化
1 | //获取memory对象 |
参数传递
1 | Object[] results = instance.exports.getFunction("函数名").apply(strPtr); |
Rust
直接解析
通过CStr和CString两个库操作
1 | #[no_mangle] |
传出字符串
Rust
返回 *mut c_char 类型即可
1 | #[no_mangle] |
Java
1 | //获取指针 |
1 | public static String getString(Integer ptr, ByteBuffer mbf) { |
wasmer-java导入函数
前言
由于wasm暂时无法支持文件读写、网络通信等系统操作。
所以现需要在Java运行wasm,同时将数据库的读写作为外部函数供给wasm调用。
问题
wasmer-java调用wasmer部分由rust编写,部分代码较老。
在wasmer仓库中,官方给出的示例为:
1 | let wasm_bytes = wat2wasm("bytes")?; |
而对于仍在使用较老版本的wasmer-java中,此方法无法奏效。
解决
通过查阅源码,发现在老版本中并没有使用 Function::new_native(&store, multiply);。
而是使用位于runtime-core 中的func! 宏
注:runtime-core被标记为已弃用
1 | fn func(_: &mut vm::Ctx, arg: i32) -> i32 { |
Rust编译成wasm执行于Java
使用emsdk的emcc可以将c代码编译成.wasm文件。
但是要将rust代码编译成.wasm文件,按照官网文档,需要使用wasm-pack进行build(安装wasm-pack时又有各种问题)。
但是最后生成的wasm有1900kb,也无法运行于Java(wasmer-java)中。
最后使用rustc --target wasm32-unknown-unknown -O <src.rs>生成wasm,大小1600kb,可以于Java中运行,但是官方GitHub下载的用rust编译的示例wasm只有1kb,跟c生成wasm文件一样
补充:cargo build --target wasm32-unknown-unknown,也行,关键参数为--target wasm32-unknown-unknown