加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2d-x中luajit的使用

发布时间:2020-12-14 21:09:56 所属栏目:百科 来源:网络整理
导读:新版本的cocos2d-x使用了luajit来替代原始的lua,好处一是可以极大的提高运行速度(android下可以开jit,运行速度提高10~60倍,ios下不可以开jit,运行速度也可以提高2~3倍)。 二是luajit编译的字节码现阶段来说无法反编译,也就是说无法破解。 这里对luaji

新版本的cocos2d-x使用了luajit来替代原始的lua,好处一是可以极大的提高运行速度(android下可以开jit,运行速度提高10~60倍,ios下不可以开jit,运行速度也可以提高2~3倍)。 二是luajit编译的字节码现阶段来说无法反编译,也就是说无法破解。 这里对luajit进行详细的说明。

1、基本使用。这个很简单,不用修改任何代码,与lua5.1完全兼容。 对应的头文件和库要替换成luajit的(与lua命名相同)

2、发布时编译成字节码。

这个需要luajit.exe的执行文件。 编译方法(windows): 在(http://luajit.org/download.html)下载源代码,使用vs的命令行工具,执行msvc.bat进行编译。 我最开始使用cygwin直接执行make结果出了很多编译错误和诡异的问题。 其实直接使用批处理才是正确的方式。

编译完成后,要注意luajit.exe和源代码src/jit文件夹要同时并且匹配使用。否则运行时会出现 "unknown luaJIT command or jit.* modules not installed"的错误。

编译成字节码的命令如下:luajit -b 原始文件 输出文件

更多详细说明可以直接执行 luajit -b来获取。 这里还要注意,输出文件最好保持.lua的扩展名,否则require文件的时候会提示找不到文件。除非require里面使用的完整名字。

我在编译字节码时还碰到了一个问题,就是无论编译什么文件都提示这个 "luajit '=' expected near '<eof>'" ,后来换了luajit的版本后就没有出现了。可能跟我一开始手欠改了luajit源代码有关。

3、编译luajit的静态库文件(for android)

编译字节码所用的执行文件和我们开发程序时使用的静态库文件要保持版本一致。 windows版本所需要的文件在编译执行文件时就已经生成。

android编译需要使用NDK在windows下进行交叉编译。 这里我一开始使用cygwin没有成功。一大堆编译错误。后来换mingw就相对顺利了。 我使用的是msys+mingw的环境(在装msysgit时附带装好的..) 编译脚本参考了cocos2d-x本身的和luajit官网的。修改如下:

<span style="font-size:14px;">    #!/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  </span>

最开始设置好SRCDIR和DIR这个是Luajit源代码的目录和编译好的库文件的安装目录。 NDK指定的是android ndk的安装目录。 原本cocos2d-x的脚本自动检测host(与这行代码相关 NDKP=$NDKVER/prebuilt/windows/bin/arm-linux-androideabi-),但是不太管用,所以统一修改为windows

这里还要注意下,我在编译armv7a的时候总是出现minilua.exe执行错误,无法编译成功,去掉-mfloat-abi=softfp后编译正常。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读