0x90

一回休み

EmscriptenでRustからJavascriptを呼んでみる

とりあえず呼び方だけでもメモしときましょう

ヘッダはrust-bindgenで作る

$ cargo install rust-bindgenしてから、$ bindgen c-headerでRustのヘッダができます。使わなさそうな関数を適当に削除しておきます。

Emscriptenのリンクオプション

val.h中の関数を使うには、リンク作業が必要です。$ export EMMAKEN_CFLAGS=--bindしておきます。

あとはひたすらtransmuteしていきます。__attribute__((constructor))がないので、初期化関数はどうすればいいんだろーか。

とりあえずalert(alert)を呼んでみました。unsafe大きい雑なコードですいません

#[macro_use]
extern crate lazy_static;

mod val;

use std::ffi::CString;

lazy_static! {
    static ref STR_ID: CString = CString::new("string").unwrap();
    static ref OBJ_ID: CString = CString::new("object").unwrap();
}

fn register_types() {
    unsafe{
        val::_embind_register_std_string(std::mem::transmute::<_, *const std::os::raw::c_void>(STR_ID.as_ptr()), STR_ID.as_ptr());
        val::_embind_register_emval(std::mem::transmute::<_, *const std::os::raw::c_void>(OBJ_ID.as_ptr()), OBJ_ID.as_ptr());
    }
}

fn main() {
    register_types();

    unsafe {
        let alert = val::_emval_get_global(CString::new("alert").unwrap().as_ptr());
        let t = OBJ_ID.as_ptr();
        val::_emval_call(alert, 1,
                         std::mem::transmute::<_, *const val::TYPEID>(&t as *const *const u8),
                         std::mem::transmute::<_, *const std::os::raw::c_void>(&alert as *const *mut std::os::raw::c_void));
    };

    println!("Hello, world!");
}