语言环境

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交互(异步线程间的数据同步)相关推荐

  1. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

  2. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  3. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  4. Java并发工具Exchanger线程间交换数据

    本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...

  5. java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题

    先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...

  6. 【java笔记】线程间通信(2):生产者和消费者案例分析

    [java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...

  7. java 多个线程共享数据_【java并发】多个线程间共享数据

    先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...

  8. cocos2d-x 中LUA和平台之间的函数调用理解

    先看一张流程图如下: 第一步: 先把NDKHelper中的方法转成LUA中可以调用的,转得方法可参考quick中LUA的用法.这个类主要是中间桥梁的作用,它可以根据是什么平台调用IOSNDKHelpe ...

  9. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

最新文章

  1. Pyhton 内置 itertools 模块chain、accumulate、compress、drop、take等函数使用
  2. 在C++平台上部署PyTorch模型流程+踩坑实录
  3. domino大百科常见问题总汇1(转载)
  4. CentOS查看CPU信息、位数、多核信息
  5. 涉密计算机网络与互联网及其,涉密计算机及网络与互联网及其他公共信息网络必须隔离 - 作业在线问答...
  6. Javascript - Select操作大集合
  7. 【转】浅谈MS-SQL锁机制
  8. 005 Android之数据存储
  9. 征文通知 | 第十八届中国计算语言学大会(CCL 2019)论文提交截止时间推迟
  10. Spring IOC 如何解决循环依赖?
  11. 【Codeforces - 900C】Remove Extra One(思维,STLset,tricks)
  12. 记录一次 自建网盘程序 cloudreve被攻击
  13. canvas绘制圆环
  14. 2022年前端还好找工作吗?
  15. office03-07兼容包
  16. 一、深度学习和神经网络
  17. 3ds Max中的复制方式
  18. 新一代云计算数据中心技术方案
  19. 06 ElasticSearch模板搜索
  20. 自动化会议提交工作流程:部署到生产

热门文章

  1. 20道vue前端面试题总结
  2. 简明Python教程(面向对象)
  3. https://blog.csdn.net/weixin_40845165/article/details/84076958
  4. CSS伪类实现遮罩层效果
  5. 安信可TB-02蓝牙模块AT透传固件的问题和解决(AT无反应)
  6. PowerCLI 通过vCenter批量更改所有的esxi主机名称和DNS
  7. Unreal动态单播委托
  8. Golang学习笔记(九)for循环语句
  9. MATLAB图形界面设计
  10. java实现一个简单的射击游戏1