我尝试创建使用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
但这些参数仅对可执行文件有效,而对共享库无效。
问题是如何使它在共享库中工作。
答案 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)
)