lua调用java过程

在cocos2dx框架中,有继承好的luaj文件来方便我们去使用lua调用java底层代码,注意:luaj只能使用在安卓平台下,如果在平台下使用,会出错,

所以使用前需要加平台判断,方法 如下:

local luaj = require("src/cocos/cocos2d/luaj")--引入luaj库

luaj.callStaticMethod("org/cocos2dx/lua/类文件名",方法名, {参数}, 签名)

例如:

在java中的text.java文件代码如下:

void showText()

{

  ....

}

lua调用代码

luaj.callStaticMethod("org/cocos2dx/lua/test","showText",{}, "()V")传递参数需要通过table存储,没用参数可以写一个空的table,最后一个参数签名是确定传参数据类型和返回数据类型。

签名中的“()”括号是填入参数类型,参数类型的签名可以打开luaj.lua文件查看,括号后的参数是返回类型。"V"是指没有返回类型,

如果参数是布尔形,返回时布尔形,签名可以写成“(Z)Z”,

贴出luaj.lua代码如下

local luaj = {}

local callJavaStaticMethod = LuaJavaBridge.callStaticMethod

local function checkArguments(args, sig)

if type(args) ~= "table" then args = {} end

if sig then return args, sig end

sig = {"("}

for i, v in ipairs(args) do

local t = type(v)

if t == "number" then

sig[#sig + 1] = "F"

elseif t == "boolean" then

sig[#sig + 1] = "Z"

elseif t == "function" then

sig[#sig + 1] = "I"

else

sig[#sig + 1] = "Ljava/lang/String;"

end

end

sig[#sig + 1] = ")V"

return args, table.concat(sig)

end

function luaj.callStaticMethod(className, methodName, args, sig)

local args, sig = checkArguments(args, sig)

--echoInfo("luaj.callStaticMethod(\"%s\",\n\t\"%s\",\n\targs,\n\t\"%s\"", className, methodName, sig)

return callJavaStaticMethod(className, methodName, args, sig)

end

return luaj

从里面可以看到,如果传入签名为空,会自动生成一个签名,但要注意,lua中并没有整形的数据类型,如果java中接收的参数是整形,传入一个float类型的签名

会出现错误,所以,如果要传入整形数据到java代码中,需要自己手动写入签名,整形的签名是“I”.

转载请注明出处,from 博客园HemJohn

时间: 2024-08-09 22:01:46

lua调用java过程的相关文章

Android平台下使用lua调用Java代码经验总结

动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方便扩展,方便嵌入被用于大多数的游戏开发中. 对于我来说.对于一个充分认识到动态的力量的人来说,在软件开发里集成一种脚本语言成为一种非常重要的非常有意义的工作. 可是在Android平台.在试过Python后,发现尽管集成也不是什么困难的事,可是感觉它还是有点大,一个动态库就有3M多,python库还

Quick-Cocos2d-x lua 调用java 在谷歌手机5.0 以上出现的问题处理方式

我在接接谷歌的SDK的时候测试发现这个问题: android art runtime check_jni.cc error on package name 经过各种查找发现是lua中的包名写法出现了问题,我之前的写法是:com.kidbear.addone.Tapme    在谷歌5.0 以上的系统就不认了,JNI的标准是斜杠,点号并不规范,不是所有的手机都支持.最后改成com/kidbear/addone/Tapme 这种方式后就没有问题了, 欢迎交流 ,交流QQ:837138108 添加最好

LuaJ 调用java方法性能研究

先简单写一下: lua调用java的方法,在luaJ中有两种. 1 使用官方提供的luaJava库 local ins = luajava.newInstance( "com.test.lj.TestClass");ins:test() 2 自己绑定方法,采用类似原版lua的方式将方法 local ins = TestClass.new() --new方法自己绑定 ins:test() 哪种方法好? 结论: 令人惊讶的是,luajava库反射调用的性能在某些情况下,竟然比java原生绑

LuaJavaBridge - lua与java互操作的简单解决方案

引入:Android平台代码和Lua代码的交互均通过C++和Java交互,Lua再和C++交互(lua  <==> C++ <==> java) 我最开始遇见这种lua调用java的做法是先用 C/C++ 借助 JNI 编写调用 Java 的接口函数,然后再将这些函数通过 tolua++ 导出给 Lua 使用.这种做法最大的问题就是太繁琐,而且稍微有一点点修改,就要重新编译,严重降低了开发效率. 后来知道了luaj这个东西,发现之前的做法简直太傻帽了. luaj 主要特征: 1.可

LuaJava学习笔记[2]使用Lua控制Java对象

LuaJava学习笔记 使用Lua控制Java对象 [资源准备] 本次依然使用LuaJava1.1作为工具,你可以到这里进行下载:http://luaforge.net/projects/luajava/.不要忘记将本地库放到项目目录中去.我的工作目录是这样的: 为了方便,我使用Maven进行的项目依赖关联,你也可以将luajava的jar包导入项目中,这两者都是等效的.如果使用的linux进行开发,你的本地库名称应该是一个so文件,这些库文件在链接页面中都可以找到. [源文件] TestObj

Lua 调用 Opencv 的方法

Lua 调用 Opencv 的方法 最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算. 那么,怎么用 Lua 调用 Opencv 呢? 查了 Torch 的官方文档,发现只有这么几个可以调用的包: 链接: https://github.com/torch/torch7/wiki/Cheatsheet 然后,你点击一个进去,发现有这么一个方法,可以安装对应的 Opencv 包:  然后,你就在终端里输入:

Oracle触发器如何调用Java实现Openfire消息发送

写在前面,要想实现整个过程的成功执行请先准备以下文件: 1. 登陆Openfire服务端以及Spark客户端相关程序(openfire_4_0_1.exe.spark_2_7_6.exe) 2. 连接Openfire和Oracle相关的jar包(presence.jar.smack.jar.smackx-debug.jar.smackx.jar.ojdbc.jar)  Step1:安装Openfire服务端并配置数据库连接,配置参考<Openfire服务器安装与配置教程> Step2:在Ecl

Lua调用C函数

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参

Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用

记得很久以前,刚开始接触Quick,那时候尝试过一次这样的操作,不过失败了. 因为那时候还年幼,对这里面的一套机制不是太熟悉.现在回头再做这样的事,遇到了问题,但是都很好的根据自己的理解给解决了. 现在记录下,我tolua成功的过程,在写blog的过程中,更熟练其中的原理. PS:网上关于quick tolua的blog都有点过时了(dualface的quick官网文章),具体的过程,还是要自己多注意. 我是基于Quick  2.2.1-rc版本实现的. ————————————————————