Dynamic libraries are not allowed on iOS but what about this?
- by tapirath
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.