項目要求對lua腳本進行加密,查了一下相關的資料 ,得知lua自己可使用luac將腳本編譯爲字節碼(bytecode)從而實現加密,試了一下,確實可行。
下面是使用原生的lua解釋器編譯字節碼:
一、新建一個名爲1.lua的文件,裏面只有一句話print("Hello Lua"),新建一個空的out.lua腳本文件
二、開始--運行--cmd
三、luac -o out.lua 1.lua
注: luac -o [編譯後腳本名] [腳本名],必要時帶上腳本路徑,如:php
回車以後,再打開out.lua就能夠看到編譯好的字節碼了工具
而後實驗一下,執行這個字節碼腳本,能夠看到lua原生的解釋器能夠直接解析luac編譯出來的bytecode腳本,很方便!ui
重點:
作完了以上的一系列以後,我照着這個方法編譯項目中的腳本,而後在cocos2dx環境下使用,發現不行!因而又查了一下資料,發現2dx使用的是luajit,lua原生編譯出來的bytecode和luajit是不兼容的,因此照着上面方法編譯出來的bytecode腳本沒法在2dx中使用。
解決這個問題其實很簡單,就是用2dx自帶的luajit編譯lua腳本,下面附上luajit編譯bytecode的方法:
一、在cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src目錄下有個msvcbuild.bat批處理文件,須要先把luajit.exe這個東西給編譯出來。
二、打開visual studio的命令行工具,這個只要裝了vs都會有,在安裝目錄裏面能夠找到。
三、用vs的命令行工具cd到luajit的src目錄
四、執行msvcbuild.bat批處理文件,編譯出luajit.exe加密
編譯完成以後,會在src目錄下生成一系列文件,其中有一個luajit.exelua
接下來就可使用luajit.exe編譯lua腳本的bytecode了:luajit -b [腳本名] [編譯後的腳本名],執行完後會在src目錄下生成一個已經編譯成bytecode的jit.lua文件spa
下面把編譯以後的jit.lua放在2dx中試一下,以HelloLua工程爲基礎,把jit.lua放到\samples\Lua\HelloLua\Resources下,修改AppDelegate.cpp中的lua調用爲std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("jit.lua");
運行結果爲:命令行
至此,luajit編譯bytecode加密已完成!code
嚴重注意:例子中,我把編譯先後的腳本名字取的不同,是爲了讓你們看出差別化來,實際在項目中使用的時候,腳本的名字編譯先後最好都一致,否則在腳本中相互require的時候可能會出現問題!blog
一個一個轉換腳太麻煩了,分享一個bat批處理,能夠批量轉換一個文件夾中的全部lua文件(此文件夾中只能包含lua文件)ip
1 @echo off 2 if exist out rd /s /q out
3 mkdir out
4 :input 5 cls 6 set input=: 7 set /p input= 拖入要編譯的lua文件夾: 8 set "input=%input:"=%" 9 if "%input%"==":" goto input 10 if not exist "%input%" goto input 11 for %%i in ("%input%") do if /i "%%~di"==%%i goto input 12 pushd %cd%
13 cd /d "%input%">nul 2>nul || exit 14 set cur_dir=%cd%
15 popd 16 set /a num = 0
17 for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do (set /a num += 1 & luajit -b %%~fsi out/%%~nxi & echo %%~nxi) 18 echo 編譯腳本數量:%num%
19 ATTRIB out/*.* +R 20 pause
---將以上代碼copy到文本中,後綴改成bat,放到cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src下
編譯後,文件夾內全部的lua腳本將被批量編譯爲字節碼,並保存在LuaJIT-2.0.1\src\out目錄下!
注意:在cocos2d-x-3.1.1版本中luajit的路徑爲:cocos2d-x-3.1.1\external\lua\luajit\src\src。
原文連接:http://www.cocoachina.com/bbs/read.php?tid=205802