Luajit2.1(支持arm64)接入到quick-x 2.2.6 ios版本

最近看到 luajit 的最新版本2.1支持arm64了,所以尝试了下用最新的luaJit替换quick-x的ios工程引用的lua5.1.5。对安卓的工程不是特别熟悉,等有时间再来研究吧。或者其他有兴趣朋友可以尝试修改下安卓工程。
下面是ios的操作步骤:

下载LuaJit
通过GIT下载Luajit代码
git clone http://repo.or.cz/luajit-2.0.git
进入Luajit下载代码目录签出分支v2.1

git checkout v2.1

放入到工程文件中
把luajit文件夹放入到quick-x工程目录lib/cocos2d-x/scripting/lua/luajit/下,重命名为LuaJIT-2.1

新建build_ios.sh文件
在luajit文件夹下创建一个build_ios.sh文件,文件内容
#!/bin/sh
DIR="( cd "( dirname “${BASH_SOURCE}” )" && pwd )"
LIPO=“xcrun -sdk iphoneos lipo”
STRIP=“xcrun -sdk iphoneos strip”

SRCDIR=$DIR/LuaJIT-2.1
echo $SRCDIR
DESTDIR=$DIR/ios
echo $DESTDIR
IXCODE=xcode-select -print-path
ISDK=$IXCODE/Platforms/iPhoneOS.platform/Developer
INFOPLIST_PATH=IXCODE/Platforms/iPhoneOS.platform/version.plist BUNDLE_ID=(/usr/libexec/PlistBuddy -c “Print :CFBundleShortVersionString” "{INFOPLIST_PATH}") ISDKVER=iPhoneOS{BUNDLE_ID}.sdk

if “{ISDKVER}" = "iPhoneOS8.0.sdk" ] || "{ISDKVER}” = “iPhoneOS8.2.sdk” ]; then
ISDKP=$IXCODE/usr/bin/
else
ISDKP=$ISDK/usr/bin/
fi

if ! -e $ISDKP/ar ]; then
sudo cp $ISDK/usr/bin/ar $ISDKP
fi

if ! -e $ISDKP/ranlib ]; then
sudo cp $ISDK/usr/bin/ranlib $ISDKP
fi

if ! -e $ISDKP/strip ]; then
sudo cp $ISDK/usr/bin/strip $ISDKP
fi

rm “$DESTDIR”/*.a
cd $SRCDIR

make clean
ISDKF="-arch armv7 -isysroot $ISDK/SDKs/ISDKVER" if {ISDKVER} = “iPhoneOS8.0.sdk” ] || ${ISDKVER} = “iPhoneOS8.2.sdk” ]; then
make HOST_CC=“gcc -m32 -arch i386” TARGET_FLAGS="$ISDKF" TARGET=arm TARGET_SYS=iOS
else
make HOST_CC=“gcc -m32 -arch i386” CROSS=$ISDKP TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
fi
mv “$SRCDIR”/src/libluajit.a “$DESTDIR”/libluajit-armv7.a

make clean
ISDKF="-arch armv7s -isysroot $ISDK/SDKs/ISDKVER" if {ISDKVER} = “iPhoneOS8.0.sdk” ] || ${ISDKVER} = “iPhoneOS8.2.sdk” ]; then
make HOST_CC=“gcc -m32 -arch i386” TARGET_FLAGS="$ISDKF" TARGET=arm TARGET_SYS=iOS
else
make HOST_CC=“gcc -m32 -arch i386” CROSS=$ISDKP TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
fi
mv “$SRCDIR”/src/libluajit.a “$DESTDIR”/libluajit-armv7s.a

make clean
make CC=“gcc -m32 -arch i386” clean all
mv “$SRCDIR”/src/libluajit.a “$DESTDIR”/libluajit-i386.a

make clean
ISDKF="-arch arm64 -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC=“gcc " CROSS=”$ISDKP" TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS
mv “$SRCDIR”/src/libluajit.a “$DESTDIR”/libluajit-arm64.a

make clean
make CC=“gcc -m64 -arch x86_64” clean all
mv “$SRCDIR”/src/libluajit.a “$DESTDIR”/libluajit-x86_64.a

$LIPO -create “$DESTDIR”/libluajit-*.a -output “$DESTDIR”/libluajit.a
$STRIP -S “$DESTDIR”/libluajit.a
$LIPO -info “$DESTDIR”/libluajit.a

rm “$DESTDIR”/libluajit-*.a

make clean

这个文件会编译生成支持armv7,armv7s,arm64,i386,x86_64的.a文件,并且把他们合并成一个libluajit.a文件,这样就可以把它导入到我们的工程里面了。
(注意:文件里面的iPhoneOS8.0.sdk,iPhoneOS8.2.sdk请更根据你自己的SDK版本调整)

文件创建完成后调用文件,你就可以在luajit/ios文件夹下看到生成好的libluajit.a文件了。

创建include文件夹
生成完.a文件后,我们还需要创建一个头文件存放的文件夹,在luajit下新建一个include文件夹,把LuaJIT-2.1下的lauxlib.h,lua.h,luaconf.h,lualib.h复制到include文件夹下。

将libluajit.a导入Xcode工程中替换lua-5.1.5
打开quickcocos2dx.xcodeproj工程文件

首先需要删除工程中对lua-5.1.5的引用


然后导入luajit下的include和iOS文件夹到工程中来

在工程设置的Header Search Paths中删除lua-5.1.5路径,添加luajit/include的路径

在Library Search Paths中增加luajit/ios的路径

在Link Binary With Libraries里面添加libluajit

到这里设置基本就完成了。

在你的MAC上安装luajit2.1
首先修改quick-x工程中bin/install_luajit.sh文件中的
LUAJIT_SRC_DIR="$ROOT_DIR/lib/cocos2d-x/scripting/lua/luajit/LuaJIT-2.1"
然后执行该.sh文件

然后在终端中执行luajit -v

如果看到版本为2.1.0-alpha就OK了。

注意:如果你以前在该MAC上安装过其他版本的luajit,很可能显示的还是以前的版本。这个时候首先执行which luajit找到你luajit的安装目录
➜ ~ which luajit
/usr/local/bin/luajit
然后切换到该目录下
然后执行 l 命令查看该目录下的所有文件


比如我的电脑上一共安装了2.0.2,2.0.3, 2.1.0三个版本的luajit。关键是看luajit这个软连接是不是指向luajit-2.1.0的,如果不是则删除这个软连接,重新创建一个指向最新版本luajit的软连接。

使用luajit预编译生成.zip包
到quick-x工程目录下的bin/lib下,修改compile_scripts.php文件中的第18行为:
array(‘jit’, ‘jit’, 1, true, ‘using luajit compile framework’),

然后调用bin下的make_framework_package.sh生成新的framework包替换游戏工程里面的framework包就可以了。

到这里用luajit arm64替换quick-x2.2.6里面使用的lua-5.1.5基本就完成了,请到真机上测试下。

不知道有没有性能测试数据

3.3final也可以这样替换luajit吗?

你可以试下,方法应该都是类似的。因为我现在的项目还是使用的2.2.6,还没有看过3.3

目前还是alpha版本,还是不够稳定啊。

嗯,我也就是换进去测试下性能会不会有明显提升。用于项目的话,还是等正式的jit 2.1版本吧。

嗯,那还得再等等了~

我编译出来之后,启动demo,创建luaVM失败。。不知为何。。
请问LZ知道吗?

能贴下错误信息吗?

现在已经没在研究了。等2.1正式版本了。
记得是luastate 为 null

楼主为啥我用你的编译成功之后,连接到自己的项目还是 下面的错误啊:10:
ld: warning: ignoring file /Users/xuejianpeng/Desktop/code/cocos2d-x-2.2.6/scripting/lua/luajit/ios/libluajit.a, missing required architecture armv7 in file /Users/xuejianpeng/Desktop/code/cocos2d-x-2.2.6/scripting/lua/luajit/ios/libluajit.a (2 slices)
Undefined symbols for architecture armv7:
“_luaL_checktype”, referenced from:

查了下编译arm64的时候报错了
==== Building LuaJIT 2.1.0-alpha ====
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C src
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
make: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc: Command not found
Makefile:237: *** Unsupported target architecture. Stop.
make: *** Error 2

我的版本的ios8.3不知道什么情况,

还真是ios8.3的问题,已经搞定,多谢楼主

请问 你的bytecode是怎么生成的 还有ios8.3 的是怎么解决的。

我上去那个网站找不v2.1下载,可以发我一个么?

和上面的兄台一个问题。请楼主帮忙解答下

bool CCLuaStack::init(void)
{
CCTime::gettimeofdayCocos2d(&m_lasttime, NULL);
m_state = lua_open();
CCAssert(m_state, “create Lua VM failed”);

s_map = this;

luaL_openlibs(m_state);

红色部分报的错,m_state是NULL

设置一下 Linker Flags 即可

#16:2: :2: :2:

#16楼 :2: :2: :2: :2: :2:

多谢兄弟帮助。