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())