lua使用rust代码--第二期

前言

lua本身提供来ffi库,来完成对C语言的对接(实际上是动态连接库*.so)。调用rust代码也是通过这个ffi。那么对于structstd::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())
03-31 00:46