编译使用LuaJIT的JNI共享库

时间:2016-06-02 14:52:55

标签: c lua java-native-interface luajit

我尝试创建使用LuaJIT的C共享库,并通过JNI在Java中使用它。我的平台是OS X(El Capitan)。

gcc -Wall -shared -fpic \ ath_lua_runtime_foundation_LuaScriptApi.c \ -ILuaJIT-2.0.4/src/ \ -I/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/include/darwin/ \ -I/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/include/ \ -L. \ -lluajit \ -o libEmbeddedLua.jnilib

它正确编译,但是当我在Java中调用它的函数时,它会崩溃JVM

SIGSEGV (0xb) at pc=0x00007fff04c5bcd0, pid=37283, tid=5891 ... Problematic frame: C [libluajit-5.1.2.dylib+0x11cd0] lua_pushcclosure+0x10

如文档中所述,对于OS X,我应该使用以下GCC参数(当我构建测试可执行文件时它可以工作):

-pagezero_size 10000 -image_base 100000000

但这些参数仅对可执行文件有效,而对共享库无效。

问题是如何使它在共享库中工作。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。这是64位macOS上的一个问题,Mike Pall讨论了它here。如果你从源代码编译一个32位的LuaJIT,那么事情就会奏效。要构建32位LuaJIT二进制文件,可以在LuaJIT目录中运行以下命令:

.Where(i => ( (!cbxYear.Checked || i.Year != null) && (!cbxMake.Checked || i.Make != null) && (!cbxModel.Checked || i.Model != null) )