我在网上看到了 LuaJavaBridge 的 使用方法这篇文章 https://segmentfault.com/a/1190000004252394?utm_source=tuicool&utm_medium=referral ,然后这里主要写一些笔记。

java调用lua或者lua调用java的方法都已经有一个现成的第三方java库提供了。而LuaJavaBridge 利用C++作为中介来实现整个过程,和那个第三方java库没关系。像这样:lua--C++--java ,java--C++--lua。

lua调用java的方法很简单

function JniUtil:callJavaBuyLife()
  local argsJson = nil
  local sigs = "()V"
  local luaj = require "cocos.cocos2d.luaj"
  local className = "org/cocos2dx/lua/AppActivity"
  local ok,ret = luaj.callStaticMethod(className, "pay", {argsJson}, sigs)
  if not ok then
    print("==== luaj error ==== : ", ret)
    return false
  else
    print("==== The JNI return is:", ret)
    return ret
  end
end

然后在java实现对应的pay函数

public static void pay() {
  // ...
}

这个过程和C++的 jni调用java很类似。

以下是java调用lua的接口:

public static native int callLuaFunctionWithString(int luaFunctionId, String value); // 调用局部Lua-Function
public static native int callLuaGlobalFunctionWithString(String luaFunctionName, String value); // 调用全局Lua-Function
public static native int retainLuaFunction(int luaFunctionId); // retain一次Lua-Function
public static native int releaseLuaFunction(int luaFunctionId); // release掉Lua-Function

分为全局函数和非全局函数,非全局函数可以retain和release,非全局函数要提供函数id

第一步,添加引用

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;

全局函数的调用很简单,值得注意的是,涉及OpenGL线程的要这样写

sInstance.runOnGLThread(new Runnable() {
  @Override
  public void run() {
    Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("G_CallbackFromJava", "success");
  }
});

其中 sInstance是对应的activity。lua函数要一个字符串参数。

第2种方法对应于lua的局部函数,其实所有非全局函数都是用这个。

那么,如何获取函数Id呢。。。

回忆一下刚才lua调用java,args = {"随便填一个字符串" , func} ,sigs = "(Ljava/lang/String;I)V" ,调用java函数的同时,将lua函数顺便传递进来了。然后就收到funcId了。

对应的java这样定义

static int luaFuncCallback = 0;
public static void callbackLua(final String tipInfo,final int luaFunc){
// 根据需要,看是否要retainLuaFunction
luaFuncCallback = luaFunc;
}

将 Lua function 作为参数传递给 Java 方法

很多时候,我们需要一种方法让 Java 代码可以向 Lua 代码传递一些消息。例如在大部分游戏平台的 SDK 中,涉及支付的部分都是异步操作的。在支付操作结束后,Java 代码需要通知 Lua 支付成功与否。

Lua 虚拟机中,Lua function 以值的形式保存。但这个值无法直接给 Java 用,所以 luaj 做了一个 Lua function 引用表。当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。Java 代码拿到这个引用 ID 后,就可以很方便的调用该 Lua function 了。

回顾最开始的示例代码,GameInterface_doBilling() 函数用于接收 Lua function 的参数就是 int 类型。因为实际传入 Java 函数的值是 Lua function 的引用 Id。(其实,Id并不一定要在这里传,随便找个地方传过来都可以,Id的值是一样的)

cocos2dx 2.1.5 的LuaJavaBridge的坑:

这个版本的 LuaJavaBridge 的全局调用函数并不是 CallLuaGlobalFunctionWithString ,而是分为两个CallLuaGlobalFunctionWithStringReturnInt和CallLuaGlobalFunctionWithStringReturnString。一开始我用CallLuaGlobalFunctionWithStringReturnString总是崩溃,然后换成CallLuaGlobalFunctionWithStringReturnInt就没事了。原因不明。

cocos2dx luajavaBridge 学习笔记的更多相关文章

  1. cocos2d-x入门学习笔记,主要介绍cocos2d-x的基本结构,并且介绍引擎自带的示例

    cocos2d-x 3.0 制作横版格斗游戏 http://philon.cn/post/cocos2d-x-3.0-zhi-zuo-heng-ban-ge-dou-you-xi http://blo ...

  2. 【Cocos2d-x】学习笔记目录

    从2019年7月开始学习游戏引擎Cocos2dx,版本3.17. 学习笔记尽量以白话的形式表达自己对源码的理解,而不是大篇幅复制粘贴源码. 本人水平有限,欢迎批评指正! Cocos2d-x 学习笔记 ...

  3. 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 之前我们已经学习过一些方法让节点“动”起来,Co ...

  4. 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一般游戏中都需要记录玩家数据,便于玩家下次登录时 ...

  5. 【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 UI在游戏中占有很重要的地位,但吸引玩家的除了这 ...

  6. 【Cocos2d-X开发学习笔记】第30期:游戏中数据的存储(下)

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.对数据进行编解码 在上一期中,我们使用了CC ...

  7. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  8. 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 图层也是渲染框架中很重要的内容.场景类用来划分游戏的状态 ...

  9. 【Cocos2d-X开发学习笔记】第12期:动作类CCAction的详细讲解

    一般对于游戏中的精灵而言,它们不仅仅是存在于场景中,而且是动态展现的,例如,精灵移动的动态效果.动 画效果.跳动效果.闪烁和旋转动态效果等.每一种效果都可以看成是精灵的一个动作. 一.动作类(CCAc ...

随机推荐

  1. bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】

    预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为-1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=mi ...

  2. echarts-gl 3D柱状图保存为图片,打印

    echarts-gl生成的立体柱状图生成图片是平面的,但是需求是3D图并且可以打印,我们的思路是先转成图片,然后再打印,代码如下: 生成3D图 <td>图表分析</td> &l ...

  3. Hive insert into directory 命令输出的文件没有列分隔符分析和解决

    参考资料:http://stackoverflow.com/questions/16459790/hive-insert-overwrite-directory-command-output-is-n ...

  4. .net环境下程序一些未知错误的调试

    由于线程冲突等一系列原因导致的处理调试方法 1.打开[事件查看器]查找出错误的地方 [控制面板]-[系统和安全]-[管理工具]-[事件查看器]

  5. C#和Java在语法上的差异(原创,持续更新中)

    1.switch  C#一直支持String类型 Java直到1.7才支持 2.C#里String有Length属性 Java里是Length方法 3.C#中修饰class的sealed效果与Java ...

  6. kill 8080 port on windows

    1. 查找PID netstat -ano | findstr :yourPortNumber 2. kill进程 taskkill /PID typeyourPIDhere /F

  7. Android基础TOP6_2:Gallery +Image完成画廊

    Activity: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  8. 一个完整的网站记录(springmvc hibernate juery bootstrap)

    总述 该网站为了满足测试人员自主添加测试条目,编辑更新信息和删除信息,同时同步到后台数据库的基本功能. 关键技术:oracle数据库.tomcat8.5.springMVC.Hibernate.aja ...

  9. MySql IFNULL 联表查询出来的null 如何赋值

    mysql中isnull,ifnull,nullif的用法如下: isnull(expr) 的用法:如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0.mysql> ...

  10. Verilog之event

    1 Explicit event The value changes on nets and variable can be used as events to trigger the executi ...