如何使用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代码了。