LuaJavaBridge - lua与java互操作的简单解决方案
引入:Android平台代码和Lua代码的交互均通过C++和Java交互,Lua再和C++交互(lua <==> C++ <==> java)
我最开始遇见这种lua调用java的做法是先用 C/C++ 借助 JNI 编写调用 Java 的接口函数,然后再将这些函数通过 tolua++ 导出给 Lua 使用。这种做法最大的问题就是太繁琐,而且稍微有一点点修改,就要重新编译,严重降低了开发效率。
后来知道了luaj这个东西,发现之前的做法简直太傻帽了。
luaj 主要特征:
1、可以从lua调用Java Class Static Method
2、调用Java方法时,支持int/float/boolean/string/Lua function 五种参数类型
3、可以将Lua function作为参数传递给Java,并让Java保存Lua function的引用
4、可以从Java调用Lua的全局函数,或者调用引用指向的Lua fuction
GL线程和UI线程概念:
GL线程:负责图像渲染 (环境切换java->lua)
UI线程:负责Android系统的用户界面 (环境切换lua->java)
1、在 cocos2d-x 启动后,Lua 代码将由 GL 线程调用,因此从 Lua 中调用的 Java 方法如果涉及到系统用户界面的显示、更新操作,那么就必须让这部分代码切换到 UI 线程上去运行。
2、反之亦然,从 Java 调用 Lua 代码时,需要让这个调用在 GL 线程上执行,否则 Lua 代码虽然执行了,但会无法更新 cocos2d-x 内部状态。
lua中使用luaj.callStaticMethod来调用java静态方法:
- //这里的func为回调函数
function JniUtil:callJavaCallbackLua(func)- local luaj = require "cocos.cocos2d.luaj"
- local className = "org/cocos2dx/lua/AppActivity"
- local args = { "callbacklua", func } //参数
- local sigs = "(Ljava/lang/String;I)V" //参数类型
- local ok = luaj.callStaticMethod(className,"callbackLua",args,sigs)
- if not ok then
- print("============= call callback error")
- else
- print("------------- call callback success")
- end
- end
在AppActivity中,加入静态方法:
- static int luaFuncCallback = 0;
- public static void callbackLua(final String tipInfo,final int luaFunc){
- // 根据需要,看是否要retainLuaFunction
- luaFuncCallback = luaFunc;
- // tipInfo为Lua里传来的“callbacklua”这里没用
- }
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
使用场景:例如我们在支付SDK中购买完了钻石回调到游戏中
java调用lua方法1:
- sInstance.runOnGLThread(new Runnable() {
- @Override
- public void run() {
- Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFuncCallback, "success");
- Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFuncCallback);
- }
- });
java调用lua方法2:
- sInstance.runOnGLThread(new Runnable() {
- @Override
- public void run() {
- //G_CallbackFromJava为lua中的全局方法
- Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("G_CallbackFromJava", "success");
- }
- });
LuaJavaBridge - lua与java互操作的简单解决方案的更多相关文章
- LuaJavaBridge - Lua 与 Java 互操作的简单解决方案
http://dualface.github.io/blog/2013/01/01/call-java-from-lua/ 最近在游戏里要集成中国移动的 SDK,而这些 SDK 都是用 Java 编写 ...
- CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案
http://dualface.github.io/blog/2013/01/27/call-objectivec-from-lua/ 月初的时候,发了一篇关于 Lua 与 Java 互操作的文章,里 ...
- lua调用java java调用lua[转载]
转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...
- 与Java互操作
课程内容涵盖了Java互操作性. Javap 类 异常 特质 单例对象 闭包和函数 变化性 Javap javap的是JDK附带的一个工具.不是JRE,这里是有区别的. javap反编译类定义,给你展 ...
- Android平台下使用lua调用Java代码经验总结
动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方 ...
- Java操作符真的简单到易如反掌?
之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...
- java定时调度器解决方案分类及特性介绍
什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的:但是我们知道还有另外一种由机器系统时间触发的程序运行场景.大家想想是否遇到或者听 ...
- lua调用java过程
在cocos2dx框架中,有继承好的luaj文件来方便我们去使用lua调用java底层代码,注意:luaj只能使用在安卓平台下,如果在平台下使用,会出错, 所以使用前需要加平台判断,方法 如下: lo ...
- Atitti.java android反编译解决方案-----虚拟机方案
Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...
随机推荐
- kNN--近邻算法
kNN--近邻算法 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性. 在机器学习中常用于分类. 数学内容: ...
- 使用 virt-install 创建虚拟机
使用 virt-install 创建虚拟机 virt-install --help 使用 qemu-kvm 创建虚拟机 介绍 1:命令路径:/usr/libexec/qemu-kvm 2:添加至环 ...
- DNS服务器的解析
---恢复内容开始--- DNS前言: 英特网作为域名和IP地址相互映射的一个分不式数据库,能够使用户更方便的访问互联网.而不用去记住能够被机器直接读取的IP地址的过程叫做域名解析(或主机名解析).D ...
- MySQL 日志功能详解
MySQL日志分类 1:查询日志 :query log 2:慢查询日志:slow_query_log 查询执行时长超过指定时长的查询操作所记录日志 3:错误日志:error log ...
- 【beta】nice!-------约吧NABCD
小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 约吧APP下载地址: 百度云:链接:http://pan.baidu.com/s/1jHNBR3g ...
- 常用的一些sql
--根据某一列中包括的逗号将一行数据变多行 select a,c from (with test as (select 'abc' a,'1,2,3' c from dual e) select a, ...
- Spring Security 入门详解
序:本文主要参考 spring实战 对里面的知识做一个梳理 1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完 ...
- 我们为什么要使用Spring Cloud?
我们为什么要使用Spring Cloud? 两个需要好好看看: Spring Boot Spring Clude Spring Cloud是一个集成了众多开源的框架,利用Spring Boot的开发便 ...
- Vue 自定义指令练习
Vue.directive(id,definition)注册一个全局自定义指令,接收两个参数,指令ID以及定义对象 取值: <div v-demo="{ color: 'white', ...
- UVA11625_Lines of Containers
题意很简单,给你一个n*m的矩阵,现在问你这个矩阵能否变为标准矩阵(即数字从小到大),如果能最少需要几步呢? 其实是个赤果果的水题.记得暑假安叔也出过一个类似的题目,那个好像是在codeforces上 ...