Cocos2dx中lua实现与java交互(异步线程间的数据同步)
语言环境
Cocos2dx 3.6
lua 5.1
java 1.8.0_144
本节问题:
lua 通过 luaj与java交互,在java中,如何回调lua?若要处理的事件代码必须在多线程中执行,又该如何保证数据的连贯统一?
本节发送的问题以及解决思路为本人实测,真实有效。
由lua 调用java 实现‘复制粘贴’说起:
复制不多说,网上成功的例子一大把,说说粘贴,
先上一段 lua 中调用java函数的代码
--调用java 取剪贴板数据
--回调函数
function AndroidFunc:getClipboard(callback)--*注意:此为java回调luaj用例*--*/回调函数作为参数以int【I】型传参local resTab = {-1,'权限不足'}--resTab = local function clipboardCallbackFromJava(params)
-- print("ClipboardCallbackFromJava datas->"..params)
-- dump(params)params = tostring(params)if params == '@-1#' then --权限不足resTab = {-1,'权限不足'}elseif params == '@0#' then --内容为空resTab = {0,''}elseresTab = {0,params}endif type(callback) == 'function' thencallback(resTab)endendlocal className = "org/cocos2dx/lua/AppActivity"local funcName = "getPasteToClipboard"local args = {clipboardCallbackFromJava}local sigs = "(I)V"local ok, ret = luaj.callStaticMethod(className, funcName , args ,sigs)--多线程先执行if not ok thenprint("取剪贴板数据调用失败 失败代码:", ret)resTab = {-1,'权限不足'}if type(callback) == 'function' thencallback(resTab)endelseresTab = {}print("取剪贴板数据调用成功 返回结果:", ret)end
end
这是我改完后的版本,要注意的点:
1.如何将一个函数以参数的形式传进java,这一点在 luaj 中有介绍,我不多说,这里提供下地址,自己去看,
JIN中java类型的定义:https://www.cnblogs.com/tianshuai11/archive/2012/03/26/2477175.html
luaj的概念用法:https://blog.csdn.net/MartinLutherSu/article/details/50470259?locationNum=1&fps=1
2.接下来是java层面
从以上代码能看出我的功能函数写在了‘org.cocos2dx.lua.AppActivity’这个类中,写的比较杂,直接写在AppActivity这种用法不推荐,我是懒得改了,java粘贴功能的实现请参照:
cocos-lua实现复制粘贴 https://www.cnblogs.com/U-tansuo/p/clip.html
// 粘贴(取剪贴板数据)public static void getPasteToClipboard(int callbackFuncID) {final Context context = instance; // 参数要加final关键字,否则内部类不能访问clipboardCallbackFunc = callbackFuncID //回调主线程的关键if (clipboardCallbackFunc != -1){try {Runnable runnable = new Runnable() {public void run() {android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);android.content.ClipData clip = clipboard.getPrimaryClip();String resText = "@-1#"; //使用特殊字符串标识if (clip != null){ //权限不足,获取失败android.content.ClipData.Item textItem = clip.getItemAt(0);if (textItem != null){ //权限不足,获取失败if (textItem.getText() != null){ //判断文本内容resText = textItem.getText().toString();}else{resText = "@0#";};};};final String aa = resText;instance.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxLuaJavaBridge.callLuaFunctionWithString(clipboardCallbackFunc, aa);}});//PasteToClipboard = textItem.getText().toString();}};// getSystemService运行所在线程必须执行过Looper.prepare()// 否则会出现Can't create handler inside thread that has not called// Looper.prepare()instance.runOnUiThread(runnable);} catch (Exception e) {Log.d("cocos2dx", "getPasteToClipboard error");e.printStackTrace();}}}
看过我上面的代码就应该明白,在执行 'getSystemService'时不能在主线程 即 handler 中运行,否则会出错,代码不要照搬啊,android.content.ClipboardManager 是我已经引入的包,若没有引入,可以通过上下文对象来获取,看到这个函数的参数 就知道 luaj 中的 callJavaStaticMethod 若传递的参数是函数 则以‘ int’来标识函数地址,这里我是这么理解的 ,lua向java 传递了一个函数,java实际拿到的是其钩子,‘clipboardCallbackFunc’这个变量是我在函数外部定义的,具体定义为:
public static int clipboardCallbackFunc = -1; //获取剪贴板粘贴的lua回调函数
回调的关键:
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(clipboardCallbackFunc, resText);
完成以上步骤,就已经完成了一大半了,接下来就是实测,我这边测是没问题的
总结:
lua在调用java代码时尽量不要在主线程中进行操作,否则一旦阻塞进程就很严重了
Cocos2dx中lua实现与java交互(异步线程间的数据同步)相关推荐
- Java并发——线程间通信与同步技术
传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...
- java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式
一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java并发工具Exchanger线程间交换数据
本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...
- java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题
先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...
- 【java笔记】线程间通信(2):生产者和消费者案例分析
[java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...
- java 多个线程共享数据_【java并发】多个线程间共享数据
先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...
- cocos2d-x 中LUA和平台之间的函数调用理解
先看一张流程图如下: 第一步: 先把NDKHelper中的方法转成LUA中可以调用的,转得方法可参考quick中LUA的用法.这个类主要是中间桥梁的作用,它可以根据是什么平台调用IOSNDKHelpe ...
- java登录时启动后台异步线程_JAVA多线程的同步和 异步
原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...
最新文章
- Pyhton 内置 itertools 模块chain、accumulate、compress、drop、take等函数使用
- 在C++平台上部署PyTorch模型流程+踩坑实录
- domino大百科常见问题总汇1(转载)
- CentOS查看CPU信息、位数、多核信息
- 涉密计算机网络与互联网及其,涉密计算机及网络与互联网及其他公共信息网络必须隔离 - 作业在线问答...
- Javascript - Select操作大集合
- 【转】浅谈MS-SQL锁机制
- 005 Android之数据存储
- 征文通知 | 第十八届中国计算语言学大会(CCL 2019)论文提交截止时间推迟
- Spring IOC 如何解决循环依赖?
- 【Codeforces - 900C】Remove Extra One(思维,STLset,tricks)
- 记录一次 自建网盘程序 cloudreve被攻击
- canvas绘制圆环
- 2022年前端还好找工作吗?
- office03-07兼容包
- 一、深度学习和神经网络
- 3ds Max中的复制方式
- 新一代云计算数据中心技术方案
- 06 ElasticSearch模板搜索
- 自动化会议提交工作流程:部署到生产