Cocos2d-x使用Luajit將Lua指令碼編譯為bytecode,從而實現加密

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   

項目要求對lua指令碼進行加密,查了一下相關的資料 ,得知lua本身可以使用luac將指令碼編譯為位元組碼(bytecode)從而實現加密,試了一下,確實可行。
下面是使用原生的lua解譯器編譯位元組碼:
1、建立一個名為1.lua的檔案,裡面只有一句話print("Hello Lua"),建立一個空的out.lua指令檔
2、開始--運行--cmd
3、luac -o out.lua 1.lua
註: luac -o [編譯後指令碼名] [指令碼名],必要時帶上指令碼路徑,如:

 

斷行符號之後,再開啟out.lua就可以看到編譯好的位元組碼了

然後實驗一下,執行這個位元組碼指令碼,可以看到lua原生的解譯器可以直接解析luac編譯出來的bytecode指令碼,很方便!

重點:
做完了以上的一系列之後,我照著這個方法編譯項目中的指令碼,然後在cocos2dx環境下使用,發現不行!於是又查了一下資料,發現2dx使用的是luajit,lua原生編譯出來的bytecode和luajit是不相容的,所以照著上面方法編譯出來的bytecode指令碼無法在2dx中使用。
解決這個問題其實很簡單,就是用2dx內建的luajit編譯lua指令碼,下面附上luajit編譯bytecode的方法:
1、在cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src目錄下有個msvcbuild.bat批次檔,需要先把luajit.exe這個東西給編譯出來。
2、開啟visual studio的命令列工具,這個只要裝了vs都會有,在安裝目錄裡面可以找到。
3、用vs的命令列工具cd到luajit的src目錄
4、執行msvcbuild.bat批次檔,編譯出luajit.exe

 

編譯完成之後,會在src目錄下產生一系列檔案,其中有一個luajit.exe

接下來就可以使用luajit.exe編譯lua指令碼的bytecode了:luajit -b [指令碼名] [編譯後的指令碼名],執行完後會在src目錄下產生一個已經編譯成bytecode的jit.lua檔案

 

下面把編譯之後的jit.lua放在2dx中試一下,以HelloLua工程為基礎,把jit.lua放到\samples\Lua\HelloLua\Resources下,修改AppDelegate.cpp中的lua調用為std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("jit.lua");
運行結果為:

 

至此,luajit編譯bytecode加密已完成!

嚴重注意:例子中,我把編譯前後的指令碼名字取的不一樣,是為了讓大家看出差異化來,實際在項目中使用的時候,指令碼的名字編譯前後最好都一致,不然在指令碼中相互require的時候可能會出現問題!

 

一個一個轉換腳太麻煩了,分享一個bat批處理,可以批量轉換一個檔案夾中的所有lua檔案(此檔案夾中只能包含lua檔案)

 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 input10 if not exist "%input%" goto input11 for %%i in ("%input%") do if /i "%%~di"==%%i goto input12 pushd %cd%13 cd /d "%input%">nul 2>nul || exit14 set cur_dir=%cd%15 popd16 set /a num = 017 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/*.* +R20 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.