Skip to content

Instantly share code, notes, and snippets.

@arkenidar
Forked from matiasinsaurralde/Makefile
Created November 17, 2022 09:34
Show Gist options
  • Save arkenidar/a88fb80febccac6f86770d3389e65176 to your computer and use it in GitHub Desktop.
Save arkenidar/a88fb80febccac6f86770d3389e65176 to your computer and use it in GitHub Desktop.
Hello World for LuaJIT FFI/C++ binding.
// Act as a source file in existing project.
#include "hello.h"
const char* Hello::World()
{
return "Hello World!\n";
}
// Act as a header file in existing project.
class Hello {
public:
const char* World();
};
-- Lua part binding, load necessary interface.
ffi = require('ffi')
ffi.cdef[[
typedef struct Hello Hello;
Hello* Hello_new();
const char* Hello_World(Hello*);
void Hello_gc(Hello*);
]]
hello = ffi.load('hello')
hello_index = {
World = hello.Hello_World
}
hello_mt = ffi.metatype('Hello', {
__index = hello_index
})
Hello = ffi.gc(hello.Hello_new(), hello.Hello_gc)
return Hello
// C++ part binding, expose necessary interface to C.
#include "hello.h"
extern "C" {
Hello* Hello_new(){
return new Hello;
}
const char* Hello_World(Hello* self){
return self->World();
}
void Hello_gc(Hello* self) {
delete self;
}
}
-- Demo how to use binding in lua project.
hello = require('hello')
ffi = require('ffi')
io.write(ffi.string(hello:World()))
all: lib run
lib:
g++ -shared -fPIC -o libhello.so libhello.cpp hello.cpp
run:
luajit main.lua
clean:
rm *.so
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment