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
的指针。
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())