当前位置:   article > 正文

Cocos2dx中lua实现与java交互(异步线程间的数据同步)_cocos2dx+lua剪贴板

cocos2dx+lua剪贴板

语言环境

   Cocos2dx 3.6

   lua 5.1

   java 1.8.0_144

本节问题:

lua 通过 luaj与java交互,在java中,如何回调lua?若要处理的事件代码必须在多线程中执行,又该如何保证数据的连贯统一?

本节发送的问题以及解决思路为本人实测,真实有效。

由lua 调用java 实现‘复制粘贴’说起:

复制不多说,网上成功的例子一大把,说说粘贴,

先上一段 lua 中调用java函数的代码

  1. --调用java 取剪贴板数据
  2. --回调函数
  3. function AndroidFunc:getClipboard(callback)
  4. --*注意:此为java回调luaj用例*
  5. --*/回调函数作为参数以int【I】型传参
  6. local resTab = {-1,'权限不足'}
  7. --resTab =
  8. local function clipboardCallbackFromJava(params)
  9. -- print("ClipboardCallbackFromJava datas->"..params)
  10. -- dump(params)
  11. params = tostring(params)
  12. if params == '@-1#' then --权限不足
  13. resTab = {-1,'权限不足'}
  14. elseif params == '@0#' then --内容为空
  15. resTab = {0,''}
  16. else
  17. resTab = {0,params}
  18. end
  19. if type(callback) == 'function' then
  20. callback(resTab)
  21. end
  22. end
  23. local className = "org/cocos2dx/lua/AppActivity"
  24. local funcName = "getPasteToClipboard"
  25. local args = {clipboardCallbackFromJava}
  26. local sigs = "(I)V"
  27. local ok, ret = luaj.callStaticMethod(className, funcName , args ,sigs)
  28. --多线程先执行
  29. if not ok then
  30. print("取剪贴板数据调用失败 失败代码:", ret)
  31. resTab = {-1,'权限不足'}
  32. if type(callback) == 'function' then
  33. callback(resTab)
  34. end
  35. else
  36. resTab = {}
  37. print("取剪贴板数据调用成功 返回结果:", ret)
  38. end
  39. 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

  1. // 粘贴(取剪贴板数据)
  2. public static void getPasteToClipboard(int callbackFuncID) {
  3. final Context context = instance; // 参数要加final关键字,否则内部类不能访问
  4. clipboardCallbackFunc = callbackFuncID //回调主线程的关键
  5. if (clipboardCallbackFunc != -1){
  6. try {
  7. Runnable runnable = new Runnable() {
  8. public void run() {
  9. android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
  10. android.content.ClipData clip = clipboard.getPrimaryClip();
  11. String resText = "@-1#"; //使用特殊字符串标识
  12. if (clip != null){ //权限不足,获取失败
  13. android.content.ClipData.Item textItem = clip.getItemAt(0);
  14. if (textItem != null){ //权限不足,获取失败
  15. if (textItem.getText() != null){ //判断文本内容
  16. resText = textItem.getText().toString();
  17. }else{
  18. resText = "@0#";
  19. };
  20. };
  21. };
  22. final String aa = resText;
  23. instance.runOnGLThread(new Runnable() {
  24. @Override
  25. public void run() {
  26. Cocos2dxLuaJavaBridge.callLuaFunctionWithString(clipboardCallbackFunc, aa);
  27. }
  28. });
  29. //PasteToClipboard = textItem.getText().toString();
  30. }
  31. };
  32. // getSystemService运行所在线程必须执行过Looper.prepare()
  33. // 否则会出现Can't create handler inside thread that has not called
  34. // Looper.prepare()
  35. instance.runOnUiThread(runnable);
  36. } catch (Exception e) {
  37. Log.d("cocos2dx", "getPasteToClipboard error");
  38. e.printStackTrace();
  39. }
  40. }
  41. }

看过我上面的代码就应该明白,在执行 'getSystemService'时不能在主线程 即 handler 中运行,否则会出错,代码不要照搬啊,android.content.ClipboardManager 是我已经引入的包,若没有引入,可以通过上下文对象来获取,看到这个函数的参数 就知道 luaj 中的 callJavaStaticMethod 若传递的参数是函数 则以‘ int’来标识函数地址,这里我是这么理解的 ,lua向java 传递了一个函数,java实际拿到的是其钩子,‘clipboardCallbackFunc’这个变量是我在函数外部定义的,具体定义为:

public static int clipboardCallbackFunc = -1;    //获取剪贴板粘贴的lua回调函数 

回调的关键:

Cocos2dxLuaJavaBridge.callLuaFunctionWithString(clipboardCallbackFunc, resText);

完成以上步骤,就已经完成了一大半了,接下来就是实测,我这边测是没问题的

总结:

lua在调用java代码时尽量不要在主线程中进行操作,否则一旦阻塞进程就很严重了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/871737
推荐阅读
相关标签
  

闽ICP备14008679号