我在网上看到了 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就没事了。原因不明。

转载于:https://www.cnblogs.com/jsfx/p/5508754.html

cocos2dx luajavaBridge 学习笔记相关推荐

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

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

  2. cocos2d-x初探学习笔记(2)--重要概念及Test例子结构

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 1.几个重要概念 在cocos2d引擎中,有几 ...

  3. cocos2d-x初探学习笔记(1)--HelloWorld

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 首先,简要介绍一下cocos2d-x,coco ...

  4. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

  5. cocos2d-x初探学习笔记(1)--HelloWorld .

    首先,简要介绍一下cocos2d-x,cocos2d-x是cocos2d引擎的c++移植版,其跨平台的特性使其很受欢迎 在cocos2d-x的网站上即可下到cocos2d-x的最新版本,下载后用vs即 ...

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

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

  7. Tiled有java版本吗_【Cocos2d-X开发学习笔记】开发工具之Tiled地图编辑器的使用

    Cocos2D-X支持Tiled地图编辑器生成的地图数据文件.Tiled地图编辑器是一个以广泛使用为目标的地图编辑html 器,它使用简单而且能够轻松地在不一样的引擎中使用.目前最新版本使用Qt框架进 ...

  8. cocos2d-x 菜鸟学习笔记一(跨平台编译)

    移动应用编程我学得比较晚,这些天看了不少cocos2d-x的教程,趁着编译的空闲记录下学习过程和其中碰到的问题. 个人认为学习任何游戏框架和引擎都必需掌握的基础知识之一就是"跨平台编译&qu ...

  9. cocos2d-x碰撞检测学习笔记

    OBB包围盒             OBB,全称是Oriented Bounding Box,也就是带有方向的包围盒.实际上,它和AABB盒一样,也是一个矩形,只不过它具有任意的方向.对OBB进行结 ...

最新文章

  1. tensor转换 pytorch tensorflow
  2. Cissp-【第4章 通信与网络安全】-2021-3-12(377页-392页)
  3. CNDO-INTGRL-SS-BINTGS-斯莱特轨道指数--- 精确方法
  4. 全球及中国回流冷凝管行业发展前景整体预测及十四五发展趋向展望报告2022-2027年版
  5. 在Powershell中禁止执行脚本
  6. 蓝桥杯 ALGO-114 算法训练 黑白无常
  7. Python IDE PyCharm2016.3.2(转)
  8. 我们为什么要学习JAVA编程语言
  9. Linux学习笔记(一):Linux介绍
  10. 【sketchup 2021】草图大师的编辑工具2【路径跟随、偏移与轴、卷尺工具和尺寸、绘制参考线】
  11. 理解什么是symbolic link in Python
  12. 同学们上课,今天我们学习:UI 操作一定要在 UI 线程吗?
  13. Linux ubuntu 装openCV,Linux(ubuntu 16.04) 安装 opencv C++
  14. React.createRef()的使用
  15. 微信公众号:开发者工具下载、安装、使用
  16. 药品名自动归类机器人
  17. 使用强大的Chrome浏览器自带截图功能
  18. 四轮差分驱动平台gazebo插件
  19. 圣诞节没什么礼物,来个爱心和彩色圣诞树代码(彩色圣诞树可以写喜欢的人名字哦)
  20. 寒假思雨姐摸底D题题解

热门文章

  1. AS3与lua之间的交互
  2. 高密度(HD)电路的设计 (主指BGA封装的布线设计)
  3. ContentType大全
  4. python 开发框架
  5. 在Developerkit开发板上运行blink例程
  6. 倒计时一天 坚果智能影院让家用投影投出你的新生活主义
  7. Java刷题知识点之进程和线程的区别
  8. 细述 Java垃圾回收机制→Java Garbage Collection Monitoring and Analysis
  9. 并行口设计数字键盘实验
  10. 动态添加的面板不生效