lua: cocos2d-x中luajit的使用

来源:互联网 发布:软件自学网官网 编辑:程序博客网 时间:2024/04/28 12:14

1.去下luajit版本,luajit.org/download.html

2.使用VS2012的Command Prompt中定位到下载luajit文件的src目录下(如:D:\LuaJIT-2.0.2\src),然后执行msvcbuild.bat(不能使用命令行,需要使用VS的命令行)

3.编译后会生成一个luajit.exe,相关的命令可以参考jit官网

4.这里给个批量执行的命令:
    for /r %%v in (*.lua) do luajit -b %%v %%v

5.复制过去就OK了


   新版本的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官网的。修改如下:
 
 
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/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 
 
#!/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
 
 
最开始设置好SRCDIR和DIR这个是Luajit源代码的目录和编译好的库文件的安装目录。     NDK指定的是android ndk的安装目录。   原本cocos2d-x的脚本自动检测host(与这行代码相关 NDKP=$NDKVER/prebuilt/windows/bin/arm-linux-androideabi-),但是不太管用,所以统一修改为windows
 
这里还要注意下,我在编译armv7a的时候总是出现minilua.exe执行错误,无法编译成功,去掉-mfloat-abi=softfp后编译正常。



0 0