Luaj是Java的Lua解释器,基于Lua5.2.x,Luaj是基于Java的实现,可在Java应用中集成Lua虚拟机。简单来说,Luaj是Lua的Java版本的实现,使用Luaj可在Java程序中运行Lua程序,换言之,也就是为Java带来了脚本功能。Luaj对JavaSE和Android都提供了支持。
在Cocos2dx中,Luaj是用来完成Lua和Java之间的数据交互的。
http://www.cocos2d-lua.org/api/luaj/index.md
local luaj = nil
-- 判断是否Android系统
local isAndroid = cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_ANDROID
if isAndroid==true then
-- 加载Luaj虚拟机
local luaj = require("cocos.cocos2d.luaj")
-- Luaj调用Java方法
-- 包名/类名,对应Android工程的manifest文件
local className = "org/cocos2dx/lua/AppActivity"
-- 设置方法名
local methodName = "setUpdateParameter"
-- 设置方法参数
local args = {"V", setSdkVersion}
-- 设置方法参数类型和返回值类型,可省略
local sigs = "(V;I)V"
-- 调用Java方法并返回
local isOk, result = luaj.callStaticMethod(className, methodName, args, sign)
if isOk then
print(result)
end
end
在Cocos2dx应用中,在加载页中通常会对SDK版本进行检测并更新,这里针对Android平台给出示例:
local Update = {
className = "com/coco2dx/org/HelperAndroid",
sdkVersionUrl = "", -- 服务端SDK版本的json文件路径,供Lua使用HTTP的XHR对象获取。
sdkDownloadUrl = "",
sdkVersion = "",
needUpdate = 0
}
-- 设置更新参数
function Update:setUpdateParameter()
local isAndroid = cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_ANDROID
if isAndroid==true then
local luaj = require("cocos.cocos2d.lua")
local className = self.className
local methodName = "setUpdateParameter"
local args = {"V", setSdkVersion}
local sigs = nil
local isOk,errCode = luaj.callStaticMethod(className, methodName, args, sigs)
if not isOk then
print("[Update:setUpdateParameter] isOk="..isOk.." errCode="..errCode)
end
else
self:checkSdkVersion()
end
end
-- 设置SDK版本
function cc.exports.setSdkVersion(version)
Update.sdkVersion = version
-- 检测SDK版本
update:checkSdkVersion()
end
-- 检测SDK版本
function Update:checkSdkVersion()
local json = require("json")
local xhr = cc.XMLHttpRequest:new()
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON
xhr:setRequestHeader("Content-Type", "application/json; charset=utf-8")
local url = Update.sdkVersionUrl
xhr:open("GET", url)
local function onHttpRequestCompletedPhone()
if xhr.status==200 then
local response = xhr.response
local data = json.decode(response)
if Update.sdkVersion~=data["sdkVersion"] then
Update.needUpdate = 1
Update.sdkDownloadUrl = data["sdkDownloadUrl"]
end
end
end
xhr:registerScriptHandler(onHttpRequestCompletedPhone)
print("[Update:checkSdkVersion] "..url)
xhr:send()
end
return Update