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以降は以下のようになった。
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カメラを使う: misc http://t.co/TnVNeSH6lk ほうほう。Rust で WebRTC GW 書いてみたいけど、そんな時間は無い。。
— voluntas#1345 (@voluntas) 2015, 7月 5
と興味を持っていただいたRustでFaceTime HDカメラやWebカメラを使う
の記事に書いたコードを近々Rust1.1.0に対応した版をこのブログで公開予定です。
関連記事