non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

libtrusterdをRustで動かした

おはようございます。奥さん出張中の息子達との実家生活もそろそろ終了です。kjunichiです。
 

TL;DR

 

 

https://github.com/trusterd/libtrusterd/tree/master/examples/trusterd_rs

 

 

初めに

Rustも1.0がリリースされたり、rebuildfmでもRustが話題になった回もあったので、また、懲りずにやってみることにした。

libtrusterdをRustで動かそうとして学べたこと

Cの文字列を扱う

以前は、

 

 

title.with_c_str(| title | unsafe {

cvNamedWindow(title);

}

 

 

と変換していたところ、1.0以降は以下のようになった。

File: src.rs

-------------------------

use std::ffi::CString;

let rs_string = &b"p 'Hello, world!'\nMyCall.my_exec('this is trusterd!')\n"[..];

let c_string = CString::new(rs_string).unwrap();

unsafe {

cfunc(c_string.as_ptr());

}

use with Gist Search

Link

 

 

 

 

int型

int型がなんとなくなっていた!

i32でOK?

関数ポインタの扱い

File: src.rs

-------------------------

extern { fn puts(s: *const libc::c_char); }

extern "C" fn callback(target: *const libc::c_char) -> c_int {

println!("This is Rust.I'm called from mruby");

unsafe {

puts(target);

}

return 0;

}

extern {

fn boot(cb: extern fn(* const libc::c_char) -> c_int ) -> c_int;

}

fn main() {

unsafe {

boot(callback);

}

}

use with Gist Search

C側に渡すコールバック関数は、extern "C"で始め、使う方はlibc由来のモノを使用するくらいがポイント。

Cargoで-Lをするには

rustcでは-Lを指定できるが、Cargoではこれが簡単には出来ず、解決方法が分かったのでうれしさ余って思わずQiitaに投稿してしまった。

あとがき

そんな訳で、

時雨堂のファウンダーの方も

 

と興味を持っていただいたRustでFaceTime HDカメラやWebカメラを使う

の記事に書いたコードを近々Rust1.1.0に対応した版をこのブログで公開予定です。

関連記事