lua 调用C 示例代码
时间: 2023-09-14 15:14:35 浏览: 49
可以直接使用 Lua 的 ffi 库调用 C 示例代码,不需要使用额外的绑定库。以下是一个简单的示例:
```lua
-- 导入 C 库
local ffi = require("ffi")
ffi.cdef[[
int add(int a, int b);
]]
local lib = ffi.load("libexample.so") -- 注意修改动态库的名称和路径
-- 调用 C 函数
local result = lib.add(1, 2)
print(result) -- 输出 3
```
当然,在实际应用中可能需要更加复杂的数据结构和函数调用方式,需要根据具体情况进行调整。
相关问题
lua调用python
Lua 可以通过 Lua 的 C API 调用 Python。下面是一个简单的示例:
```lua
-- 加载 Lua 的 C 库
local ffi = require("ffi")
ffi.cdef[[
void* luaL_newstate();
void luaL_openlibs(void*);
int luaL_loadstring(void*, const char*);
int lua_pcall(void*, int, int, int);
void lua_close(void*);
]]
-- 创建 Lua 状态机
local L = ffi.cast("lua_State*", ffi.C.luaL_newstate())
-- 加载 Python 解释器
ffi.C.luaL_openlibs(L)
-- 执行 Python 代码
local pythonCode = [[
import math
def calculate_square_root(x):
return math.sqrt(x)
result = calculate_square_root(16)
]]
local status = ffi.C.luaL_loadstring(L, pythonCode)
if status == 0 then
ffi.C.lua_pcall(L, 0, 0, 0)
else
local errorMsg = ffi.string(ffi.C.lua_tolstring(L, -1, nil))
print("Error executing Python code: " .. errorMsg)
end
-- 关闭 Lua 状态机
ffi.C.lua_close(L)
```
这个示例中,通过 Lua 的 C API,我们创建了一个 Lua 状态机,并加载了 Python 解释器。然后,我们执行了一段 Python 代码,其中调用了 `math.sqrt()` 函数计算平方根。最后,关闭了 Lua 状态机。
请注意,这只是一个简单的示例,实际情况可能会更复杂,具体实现需要根据实际需求进行调整。
写一个lua调用c和c调用lua的程序
以下是一个简单的示例程序,其中Lua调用了C函数,C函数又回调了Lua函数。
C代码:
```c
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int c_hello(lua_State *L) {
printf("Hello from C!\n");
return 0;
}
static int c_call_lua(lua_State *L) {
const char *str = luaL_checkstring(L, 1);
printf("C calling Lua: %s\n", str);
lua_pushinteger(L, 12345);
lua_pushstring(L, "Hello from Lua!");
return 2;
}
static int c_call_lua_callback(lua_State *L) {
const char *str = luaL_checkstring(L, 1);
lua_Integer num = luaL_checkinteger(L, 2);
luaL_checktype(L, 3, LUA_TFUNCTION);
lua_pushvalue(L, 3); // 把回调函数压入栈中
lua_pushstring(L, str);
lua_pushinteger(L, num);
int result = lua_pcall(L, 2, 1, 0); // 调用回调函数
if (result != 0) {
printf("Error calling Lua callback: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
return 0;
}
const char *ret_str = lua_tostring(L, -1);
printf("C received from Lua callback: %s\n", ret_str);
return 0;
}
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_pushcfunction(L, c_hello);
lua_setglobal(L, "c_hello");
lua_pushcfunction(L, c_call_lua);
lua_setglobal(L, "c_call_lua");
lua_pushcfunction(L, c_call_lua_callback);
lua_setglobal(L, "c_call_lua_callback");
luaL_dostring(L, "function lua_hello() print('Hello from Lua!') end");
luaL_dostring(L, "c_hello()");
luaL_dostring(L, "print(c_call_lua('Hello from C!'))");
luaL_dostring(L, "c_call_lua_callback('Hello from C callback!', 123, function(str, num) print('Lua callback received:', str, num) return 'Hello from Lua callback!' end)");
lua_close(L);
return 0;
}
```
Lua代码:
```lua
local function lua_callback(str, num)
print("Lua received from C callback:", str, num)
return "Hello from Lua callback!"
end
c_hello()
local num, str = c_call_lua("Hello from Lua!")
print("Lua received from C:", num, str)
c_call_lua_callback("Hello from Lua callback!", 123, lua_callback)
```
在运行该程序时,会输出以下内容:
```
Hello from C!
12345 Hello from Lua!
Lua callback received: Hello from C callback! 123
C received from Lua callback: Hello from Lua callback!
Lua received from C callback: Hello from Lua callback! 123
```