lua使用rust代碼--第二期
前言
lua自己提供來ffi庫,來完成對C語言的對接(其實是動態鏈接庫*.so)。調用rust代碼也是經過這個ffi。那麼對於struct
,std::string::String
,Vec\<struct\>
,也因該保持其與C代碼有相同的結果。數組
背景知識 對於數組在C中就是指向數組中第一個元素的指針。爲了防止內存過界,全部數組操做必須獲取數組的長度。在rust代碼中數組的長度(len)和大小(cap)已經被封裝。
std::string::String
string在C裏就是char
的指針。ui
rust
use std::ffi::CString; use std::os::raw::{c_char, c_int}; #[no_mangle] pub extern "C" fn get_string(len *mut c_int) -> *const c_char{ let rust_string = String::from("這時一個字符串"); let c_string = CString::new(coco.remote_addr.as_str()).unwrap(); len = rust_string.len() as c_int;//獲取字符串長度 let c_string_ptr = c_string..as_ptr(); std::mem::forget(c_string);//避免被drop c_string_ptr }
lua
ffi = require("ffi") ffi.cdef[[ char * get_all_data(int*); ]] local rust_lib = ffi.load("libexample.so") local intPtr = ffi.typeof("int[1]")--初始化int* local function get_string() local c_len = intPtr() local c_string = rust_lib.get_string(c_len) local lua_len = c_len[0] local lua_string = ffi.string(c_string,lua_len) return lua_string end print(get_string())