cocos2dx luajavaBridge 学习笔记
我在网上看到了 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 学习笔记的更多相关文章
- 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 ...
- 【Cocos2d-x】学习笔记目录
从2019年7月开始学习游戏引擎Cocos2dx,版本3.17. 学习笔记尽量以白话的形式表达自己对源码的理解,而不是大篇幅复制粘贴源码. 本人水平有限,欢迎批评指正! Cocos2d-x 学习笔记 ...
- 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 之前我们已经学习过一些方法让节点“动”起来,Co ...
- 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一般游戏中都需要记录玩家数据,便于玩家下次登录时 ...
- 【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 UI在游戏中占有很重要的地位,但吸引玩家的除了这 ...
- 【Cocos2d-X开发学习笔记】第30期:游戏中数据的存储(下)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.对数据进行编解码 在上一期中,我们使用了CC ...
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...
- 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用
本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 图层也是渲染框架中很重要的内容.场景类用来划分游戏的状态 ...
- 【Cocos2d-X开发学习笔记】第12期:动作类CCAction的详细讲解
一般对于游戏中的精灵而言,它们不仅仅是存在于场景中,而且是动态展现的,例如,精灵移动的动态效果.动 画效果.跳动效果.闪烁和旋转动态效果等.每一种效果都可以看成是精灵的一个动作. 一.动作类(CCAc ...
随机推荐
- laravel生命周期和核心思想
工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...
- Java多线程(九) synchronized 锁对象的改变
public class MyService { private String lock = "123"; public void testMethod() { synchroni ...
- python自动化测试学习笔记-9测试框架
学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:
- [NOI2003]Editor
Description 很久很久以前,DOS3.x的程序员们开始对 EDLINEDLIN 感到厌倦. 于是,人们开始纷纷改用自己写的文本编辑器?? 多年之后,出于偶然的机会,小明找到了当时的一个编辑软 ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- ora-00600 to check
Hi , Let us know issue reproducibility executing following statement from command prompt: SELECT &qu ...
- 实现div左右上下都居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- string与int的相互转换C++(转)
string与int之间的相互转换C++(转) #include<iostream> #include<string> #include<sstream> usin ...
- Angular JS中自定义标签 属性绑定的解释
看到自定义标签的文档时,文档作者解释的能力实在太弱,也可能是本人太笨,一下绕不过来. 看了一个stackoverflow答案,才算明白,在此贴出翻译,以供大家参考. .csharpcode, .csh ...
- vs2012 jsoncpp 链接错误
解决: 项目->属性->C/C++->代码生成->运行库->设置与使用的.lib的版本一致.