GVKun编程网logo

Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密(lua cocos2d)

13

如果您对Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密和luacocos2d感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Cocos2d-x使用Luajit

如果您对Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密lua cocos2d感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密的各种细节,并对lua cocos2d进行深入的分析,此外还有关于cocos 使用Luajit将Lua脚本编译为bytecode,从而实现加密、Cocos-2dx-Lua中使用Luaj的完整示例、cocos2d-x 2.2.0 如果你在iOS上使用luajit出现了 "bad header in precompiled chunk"、Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境的实用技巧。

本文目录一览:

Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密(lua cocos2d)

Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密(lua cocos2d)

项目要求对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文件)

@echooff
if exist out rd /s /q out
mkdir out
:input
cls
set input=:
set /p input= 拖入要编译的lua文件夹:
set "input=%input:"=%"
if "%input%"==":" goto input
if not exist "%input%" goto input
for %%i in ("%input%") do if /i "%%~di"==%%i goto input
pushd %cd%
cd /d "%input%">nul 2>nul || exit
set cur_dir=%cd%
popd
set /a num = 0
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do (set /a num += 1 & luajit -b %%~fsi out/%%~nxi & echo %%~nxi)
echo 编译脚本数量:%num%
ATTRIB out/*.* +R
pause

---将以上代码copy到文本中,后缀改为bat,放到cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src下

编译后,文件夹内所有的lua脚本将被批量编译为字节码,并保存在LuaJIT-2.0.1\src\out目录下!

cocos 使用Luajit将Lua脚本编译为bytecode,从而实现加密

cocos 使用Luajit将Lua脚本编译为bytecode,从而实现加密

项目要求对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文件)
@echo off
if exist out rd /s /q out
mkdir out
:input
cls
set input=:
set /p input= 拖入要编译的lua文件夹:
set "input=%input:"=%"
if "%input%"==":" goto input
if not exist "%input%" goto input
for %%i in ("%input%") do if /i "%%~di"==%%i goto input
pushd %cd%
cd /d "%input%">nul 2>nul || exit
set cur_dir=%cd%
popd
set /a num = 0
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do (set /a num += 1 & luajit -b %%~fsi out/%%~nxi & echo %%~nxi)
echo 编译脚本数量:%num%
ATTRIB out/*.* +R
pause


---将以上代码copy到文本中,后缀改为bat,放到cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src下



编译后,文件夹内所有的lua脚本将被批量编译为字节码,并保存在LuaJIT-2.0.1\src\out目录下!


转载地址:http://www.cocoachina.com/bbs/read.php?tid=205802

Cocos-2dx-Lua中使用Luaj的完整示例

Cocos-2dx-Lua中使用Luaj的完整示例

如何使用Luaj进行java与Lua之间的交互调用

一、主要分为两个大步骤,Lua工程的修改,android工程的修改
二、工程环境
开发工具:Cocos-Code-IDE
Lua版本 : Lua 5.1
java版本:1.7
NDK版本:android-ndk-r10c
ANT版本:apache-ant-1.9.4
Framwork:cocos-2dx-3.4
python : 2.7.3

三、Lua工程中的修改

1.在Cocos-Code-IDE中新建Lua工程
可以在这个工程目录中找到Luaj:

2.新建一个lua类,写上调用android的方法。
我在src/app/models/下面新建了一个Lua文件,命名为:luajTest.lua
其中代码如下:

local luaj = require "cocos.cocos2d.luaj" --引入luaj

local luajTest = class("luajTest")  -- 构建lua 类

function luajTest:callandroid() --调用android的方法实现
    --包名/类名 这个可以在对应的android工程的manifest中得到 
    local className="org/cocos2dx/lua/AppActivity" 
    local args = { "hello android",callbackLua }  
    local sigs = "(Ljava/lang/String;I)V" --传入string参数,无返回值 

    --luaj 调用 Java 方法时,可能会出现各种错误,因此 luaj 提供了一种机制让 Lua 调用代码可以确定 Java 方法是否成功调用。 
    --luaj.callStaticmethod() 会返回两个值 
    --当成功时,第一个值为 true,第二个值是 Java 方法的返回值(如果有) 
    --当失败时,第一个值为 false,第二个值是错误代码 
    local ok,ret = luaj.callStaticmethod(className,"test",args,sigs)  
    if not ok then  

        item:setString(ok.."error:"..ret)  

    end 

end

return luajTest

3.在入口场景中调用android方法。
我修改了src/app/views/MainScene.lua的场景跳转方法,如下:

local MainScene = class("MainScene",cc.load("mvc").ViewBase)
local testluaj = require('src.app.models.luajTest')--引入luajTest类


function MainScene:onCreate()
    -- add background image
    display.newSprite("MainSceneBg.jpg")
        :move(display.center)
        :addTo(self)

    -- add play button
    local playButton = cc.MenuItemImage:create("PlayButton.png","PlayButton.png")
        :onClicked(function()
            self:getApp():enterScene("PlayScene") --跳转了一个场景

            --在这里尝试调用android static代码
            local testluajobj = testluaj.new(self)

            testluajobj.callandroid(self);



        end)
    cc.Menu:create(playButton)
        :move(display.cx,display.cy - 200)
        :addTo(self)
end

return MainScene

4.以上为Lua工程中的修改。

四、android工程的修改

1.找到相对应的android工程的。
Lua工程通过Runtime构建的android工程在Lua工程\framewokes\runtime-src\proj.android中。

2.根据luajTest.lua类中定义的包名类名,找到AppActivity.java

3.打开AppActivity.java,在空白处加上uajTest.lua类中定义要调用的方法test.

public static void test(final String param,final int luaFunc) {
        System.out.println("----传过来的参数----param:"+param);  
        System.out.println("-------luaFunc:"+luaFunc);  

        /** * 给lua返回一个字符串 */  
        Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunc,"success");  
        /** * 移除luaId */  
        Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFunc);  
    }

记得在文件上面引入Cocos2dxLuaJavaBridge类。

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;

4.到此,修改完成。构建apk,安装到手机中,看Log.
如果看到以下Log,证明你的Luaj成功调用了java代码了。

cocos2d-x 2.2.0 如果你在iOS上使用luajit出现了

cocos2d-x 2.2.0 如果你在iOS上使用luajit出现了 "bad header in precompiled chunk"

请注意cocos2d-x在iOS平台上默认并没有使用luajit运行时,而是lua运行时。
请在你的项目中移除所有对lua源文件和头文件的引用,加入luajit的头文件,并且把libluajit.a加入到你项目的链接库中。

Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境

Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境

这几天一直在试一些cocos2dx lua的开发环境,试过cocos code ide 1.2和cocos code ide 2.0。前者莫名其妙软件崩
溃,后者却不支持lua的自动补齐和代码提示,只能回归vs2012了。
    本文就默认大家都下好了cocos2d-x3.9,其实cocos2d-x3.x都差不多,稍微有点区别。也默认大家都装好了BabeLua。我的
BabeLua不是1.x版本的,是3.x版本的。
我的BabeLua安装好后,会在VS2012控制面板出现一个Lua按钮,点击按钮后没有网上其他教程说的Lua Setting,这个没有
关系。
下面开始搭建环境:
    1.进入到cocos2dx3.9 源码包的tools/cocos2d-console/bin目录下,使用cocos new 项目名称 -p com.cocos.game
 -l lua -d 工程目录 这种方式来创建cocos2dxlua 项目。创建好的项目目录是这样的(我的项目名称是HelloLua003):
2.用VS2012打开刚刚创建的项目,注意入口是在frameworks/runtime-src/proj.win32
点击编译运行,会将之前的项目目录更新成如下所示:
新生成的simulator目录下有我们需要使用的模拟器HelloLua003.exe文件,这个在配置lua环境需要用到。
    3.点击VS2012上方的Lua按钮,选择new lua project,配置好后如下图所示:
下面对每个选择进行详细介绍
    Lua Project
    Lua scripts folder:选择Lua文件的保存位置,一般是src
    Lua exe path:选择模拟器的位置,在simulator/win32下面的.exe文件
    注意,在选择完Lua exe path 后会自动生成下面的Working path,默认是生成的simulator/win32,这个是错误的,改成
自己的项目目录
    Working path:工程目录,比如我的是E:\cocos2dx_proj\cocos2d_proj\cocos2dx_3.9_Lua_proj\HelloLua003
    Command line:输入-workdir 项目目录 -file src\main.lua,比如我的是-workdir E:\cocos2dx_proj\
cocos2d_proj\cocos2dx_3.9_Lua_proj\HelloLua003 -file src\main.lua
    Lua project name:可以随意自己定,比如我就直接写的Lua

    4.点击确认后会在vs上生成Lua工程目录
6.将Lua设置为启动项后点击运行,得到如下界面表示成功。
当然,我推荐使用sublime text2 来写代码,写好代码会自动同步到vs当中,然后使用vs编译查看效果。具体的sublime
 text2 配置cocos2dx lua api 环境,可以自行百度,网上教程很多。

今天的关于Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密lua cocos2d的分享已经结束,谢谢您的关注,如果想了解更多关于cocos 使用Luajit将Lua脚本编译为bytecode,从而实现加密、Cocos-2dx-Lua中使用Luaj的完整示例、cocos2d-x 2.2.0 如果你在iOS上使用luajit出现了 "bad header in precompiled chunk"、Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境的相关知识,请在本站进行查询。

本文标签: