cocos2dx 如何使用luajit

2015年01月12日 16:59 0 点赞 0 评论 更新于 2025-11-21 14:09

在早期的 Cocos2d-x 版本中,使用的是 Lua 作为脚本语言。而新版本的 Cocos2d-x 则采用 LuaJIT 替代了原始的 Lua,主要有以下两个显著优势:

  • 提升运行速度:在 Android 平台下开启 JIT(Just-In-Time)编译后,运行速度可提高 10 - 60 倍;在 iOS 平台下虽无法开启 JIT,但运行速度仍能提高 2 - 3 倍。
  • 增强安全性:现阶段,LuaJIT 编译生成的字节码无法被反编译,有效防止代码被破解。

接下来,将详细介绍在 Cocos2d-x 中使用 LuaJIT 的方法。

1. 基本使用

LuaJIT 与 Lua 5.1 完全兼容,因此在基本使用时,无需对代码进行任何修改。但需要将对应的头文件和库替换为 LuaJIT 的(其命名与 Lua 相同)。

2. 发布时编译成字节码

要将 Lua 代码编译成字节码,需要使用 luajit.exe 执行文件,具体步骤如下:

2.1 下载并编译 luajit.exe

可从 http://luajit.org/download.html 下载 LuaJIT 的源代码。在 Windows 环境下,建议使用 VS 的命令行工具,执行 msvc.bat 进行编译。作者最初尝试使用 Cygwin 直接执行 make 命令,结果出现了大量编译错误和异常问题,而使用批处理脚本才是正确的做法。

2.2 编译注意事项

编译完成后,务必确保 luajit.exe 和源代码中的 src/jit 文件夹同时存在且版本匹配。否则,在运行时会出现 "unknown luaJIT command or jit.* modules not installed" 错误。

2.3 编译字节码命令

使用以下命令将 Lua 代码编译成字节码:

luajit -b 原始文件 输出文件

若想获取更多详细说明,可直接执行 luajit -b 命令。另外,输出文件最好保持 .lua 扩展名,否则在使用 require 加载文件时,可能会提示找不到文件,除非在 require 中使用完整的文件名。

2.4 常见问题及解决方法

作者在编译字节码时遇到一个问题,即无论编译哪个文件,都会提示 "luajit '=' expected near '<eof>'"。后来更换了 LuaJIT 的版本,该问题便不再出现,推测可能是最初手动修改了 LuaJIT 源代码所致。

3. 编译 LuaJIT 的静态库文件(针对 Android 平台)

编译字节码所用的执行文件和开发程序时使用的静态库文件必须保持版本一致。在 Windows 平台编译执行文件时,会同时生成所需的文件。

3.1 交叉编译环境选择

在 Android 平台进行编译时,需要使用 NDK 在 Windows 下进行交叉编译。作者最初尝试使用 Cygwin 进行编译,但出现了大量编译错误,后来更换为 MinGW 后,编译过程相对顺利。作者使用的是 msys + mingw 环境(在安装 msysgit 时会附带安装)。

3.2 编译脚本

编译脚本参考了 Cocos2d-x 本身和 LuaJIT 官网的脚本,并进行了如下修改:

#!/bin/sh
SRCDIR=/c/msysgit/msysgit/LuaJit-2.0.2
DIR=/d/MyProj/develop/lib/cocos2d-x/scripting/lua/luajit
cd "$SRCDIR"
NDK=/d/adt-bundle-windows/android-ndk-r8e
NDKABI=8
NDKVER=$NDK/toolchains/arm-linux-androideabi-4.7
NDKP=$NDKVER/prebuilt/windows/bin/arm-linux-androideabi-
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"

# Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)
DESTDIR=$DIR/android/armeabi
rm "$DESTDIR"/*.a
make clean
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_SYS=Linux TARGET_FLAGS="$NDKF"
if [ -f $SRCDIR/src/libluajit.a ]; then
mv $SRCDIR/src/libluajit.a $DESTDIR/libluajit.a
fi

# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)
NDKARCH="-march=armv7-a -Wl,--fix-cortex-a8"
DESTDIR=$DIR/android/armeabi-v7a
rm "$DESTDIR"/*.a
make clean
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_SYS=Linux TARGET_FLAGS="$NDKF $NDKARCH"
if [ -f $SRCDIR/src/libluajit.a ]; then
mv $SRCDIR/src/libluajit.a $DESTDIR/libluajit.a
fi

# Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)
NDKABI=14
DESTDIR=$DIR/android/x86
NDKVER=$NDK/toolchains/x86-4.7
NDKP=$NDKVER/prebuilt/windows/bin/i686-linux-android-
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"
rm "$DESTDIR"/*.a
make clean
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_SYS=Linux TARGET_FLAGS="$NDKF"
if [ -f $SRCDIR/src/libluajit.a ]; then
mv $SRCDIR/src/libluajit.a $DESTDIR/libluajit.a
fi

make clean

2.3 脚本参数说明

  • SRCDIRDIR:分别为 LuaJIT 源代码的目录和编译好的库文件的安装目录。
  • NDK:指定 Android NDK 的安装目录。
  • 原本 Cocos2d-x 的脚本会自动检测主机环境,但效果不佳,因此统一将其修改为 Windows 环境。

2.4 编译问题及解决方法

作者在编译 armv7a 时,minilua.exe 总是执行出错,导致编译失败。去掉 -mfloat-abi=softfp 后,编译恢复正常。

通过以上步骤,你就可以在 Cocos2d-x 中顺利使用 LuaJIT 了。

作者信息

feifeila

feifeila

共发布了 3994 篇文章