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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;
  • 1

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

 http://blog.csdn.net/A_AsinCEO/article/details/49307997

 

 

时间: 2024-09-11 10:21:45

Cocos-2dx-Lua中使用Luaj的完整示例(转)的相关文章

Lua中的函数写法简明示例

  这篇文章主要介绍了Lua中的函数写法简明示例,本文是一篇个人学习笔记,简单的记录了Lua函数的写法,需要的朋友可以参考下 函数定义:用关键字function定义函数,以关键字end结束 局部变量:用关键字local定义.如果没有用local定义,即使在函数内部定义定义的变量也是全局变量! 函数可以有多个返回值:return a,b,c... 平行赋值:a,b=c,d 全局变量:前面的代码定义了三个全局变量:foo,r1,r2 这是我写的第一个Lua函数: 复制代码 代码如下: functio

Lua中的函数写法简明示例_Lua

函数定义:用关键字function定义函数,以关键字end结束 局部变量:用关键字local定义.如果没有用local定义,即使在函数内部定义定义的变量也是全局变量! 函数可以有多个返回值:return a,b,c... 平行赋值:a,b=c,d 全局变量:前面的代码定义了三个全局变量:foo,r1,r2 这是我写的第一个Lua函数: 复制代码 代码如下: function foo(a,b,c)      local sum=a+b      return sum,c  --函数可以有多个返回值

Lua中算术运算符的使用示例_Lua

下表列出了所有的Lua语言支持的算术运算符.假设变量A持有10和变量B持有20,则:  例子 试试下面的例子就明白了所有的Lua编程语言提供了算术运算符: 复制代码 代码如下: a = 21 b = 10 c = a + b print("Line 1 - Value of c is ", c ) c = a - b print("Line 2 - Value of c is ", c ) c = a * b print("Line 3 - Value o

Cocos2d-x Lua中使用标签

游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字"COCOS2DX",动态文字如图4-1所示游戏场景中的②号文字"Hello World".静态文字一般是由美工使用Photoshop绘制在背景图片上,这种方式的优点是表现力很丰富,例如:①号文字"COCOS2DX"中的"COCOS"."2D"和"X"设计的风格不同,而动态文字则不能,而且静态文字无法通过程序访

简单讲解Lua中的垃圾回收机制

  这篇文章主要介绍了Lua中的垃圾回收机制,自动的垃圾回收是Lua的重要特性之一,需要的朋友可以参考下 Lua使用基于被内置在Lua某些算法的垃圾收集自动内存管理.可以自动内存管理的结果,作为一个开发者: 没有必要担心的对象分配内存. 无需释放他们时,不再需要可将其设置为nil. Lua使用运行不时收集死的对象时,不再从Lua程序中访问垃圾收集器. 所有对象,包括表,用户数据,函数,线程,字符串等受自动内存管理. Lua使用增量标记和使用两个数字来控制其垃圾回收周期即垃圾收集暂停和垃圾收集器的

lua中赋值类型代码详解

  本文主要给大家介绍了lua中解析复制类型代码的过程,非常的细致全面,有需要的小伙伴可以参考下 我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: ? 1 2 3 foo = "bar" local a, b = "a", "b" foo = a 首先我们先使用ChunkySpy这个工具来看看vm最终会具体生成什么样的vm instructions 在这里,开头为[数字]的行是vm真正生成的字节码,我们看到一共生成了六行字

Lua中的weak表——weak table(转)

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak references,元素为弱引用的表就叫弱表.有弱引用那么也就有强引用,有引用那么也就有非引用.我们先要厘这些基本概念:变量.值.类型.对象. (1)变量与值:Lua是一个dynamically typed language,也就是说在Lua中,变量没有类型,它可以是任何东西,而值有类型,所以Lua中没

Cocos2d-x Lua中帧动画

帧动画就是按一定时间间隔.一定的顺序.一帧一帧地显示帧图片.我们的美工要为精灵的运动绘制每一帧图片,因此帧动画会由很多帧组成,按照一定的顺序切换这些图片就可以了. 在Cocos2d-x Lua中播放帧动画涉及到两个类:Animation和Animate,类图如图所示,Animation是动画类,它保存有很多动画帧,Animate类是动作类它继承于ActionInterval类,属于间隔动作类,它的作用是将Animation定义的动画转换成为动作进行执行,这样我们就看到动画播放的效果了.    

Lua中的loadfile、dofile、loadstring、require用法实例_Lua

复制代码 代码如下: do  local errorInfo = loadfile("test.lua"); --load code file  if(errorInfo == nil) then   print("load file failed");  else   print("load file success");   local doInfo = dofile("test.lua") --complie the f