The code below demonstrates the technique:
Code: Select all
/*
(c) 2012 +++ Filip Stoklas, aka FipS, http://www.4FipS.com +++
THIS CODE IS FREE - LICENSED UNDER THE MIT LICENSE
ARTICLE URL: http://forums.4fips.com/viewtopic.php?f=3&t=589
*/
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
} // extern "C"
#include <cassert>
// Please note that despite the fact that we build this code as a regular
// executable (exe), we still use __declspec(dllexport) to export
// symbols. Without doing that FFI wouldn't be able to locate them!
extern "C" __declspec(dllexport) void __cdecl hello_from_lua(const char *msg)
{
printf("A message from LUA: %s\n", msg);
}
const char *lua_code =
"local ffi = require('ffi') \n"
"ffi.cdef[[ \n"
"const char * hello_from_lua(const char *); \n" // matches the C prototype
"]] \n"
"ffi.C.hello_from_lua('Hello from LUA!') \n" // do actual C call
;
int main()
{
lua_State *lua = luaL_newstate();
assert(lua);
luaL_openlibs(lua);
const int status = luaL_dostring(lua, lua_code);
if(status)
printf("Couldn't execute LUA code: %s\n", lua_tostring(lua, -1));
lua_close(lua);
return 0;
}
// output:
// A message from LUA: Hello from LUA!