Dynamic libraries are not allowed on iOS but what about this?
Posted
by
tapirath
on Game Development
See other posts from Game Development
or by tapirath
Published on 2012-09-25T08:56:15Z
Indexed on
2012/09/25
9:49 UTC
Read the original article
Hit count: 289
I'm currently using LuaJIT and its FFI interface to call C functions from LUA scripts. What FFI does is to look at dynamic libraries' exported symbols and let the developer use it directly form LUA. Kind of like Python ctypes.
Obviously using dynamic libraries is not permitted in iOS for security reasons. So in order to come up with a solution I found the following snippet.
/*
(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!
Basically, instead of using a dynamic library, the symbols are exported directly inside the executable file.
The question is: is this permitted by Apple?
Thanks.
© Game Development or respective owner