AndroLua, Luajava初步探究

来源:互联网 发布:网络监控代理 编辑:程序博客网 时间:2024/05/19 18:15

搞了一整天几乎要发狂了,终于完成了一点点androLua和luajava的初步探究。下面总结一下吧:


在上一篇博文里面已经说明了如何在Android中嵌入lua脚本,按照步骤操作应该可以完成android中使用简单的lua脚本,进行动态添加和修改安卓页面而不需要重装apk。当然,我的最终目的也在于此。


但是今天继续使用更复杂一点的lua脚本来使用android api的时候,碰到了问题了。比如,我想添加一个button,却无法设置字体颜色;想要给button添加一个OnClickListener,也做不到。


在缺乏现有说明文档,各类教程以及前人经验的情况下,只好采取这种办法,一步一步来吧。就在今天早上,我还是什么都不懂;lua, jni, ndk,c, 这是所要用到的技术范畴。


好,先来看lua, lua是一个脚本语言,语法比较简单,更我的目的有关系的是,lua可以把c语言作为宿主语言,在Lua中调用C方法。同时,也可以被c调用;这个是lua可以嵌入android的基础。


既然lua可以和c交互,那么lua可以与java交互吗?有好事的人Tiago Ponte就实现了这个功能。怎么交互?他没有写出一个原生的lua直接与c交互的方法,他利用java的ndk加了一层,让java与c交互,再让c与lua交互,这样就实现了间接的lua和java交互。这个就是luajava.当然luajava又集成了一下lua的解释器,这样使用Luajava貌似并不需要lua脚本。


AndroLua这个开源项目本质上貌似和luajava没啥区别,只不过是把luajava搞的那一些jni,用android的ndk重新打包了一下,这样就可以在android中调用lua了。就像作者说的,他做这个的初衷也只是在学习android ndk的使用而已。


大概的逻辑就是这样了。那么如何使用呢?我今天的工作就是体验了一把从luajava源码到luajava编译好放入java项目中使用的流程。主要的编译逻辑其实就是java的jni使用;如果会jni,那么luajava就可以自己修订了。

luajava使用流程见官网:

http://www.keplerproject.org/luajava/manual.html


下面是我自己翻译的一点点luajava的使用方法:



主要是翻译了luajava的官网里面内容,抽出来我自己需要的,列举如下:


luajava包含了5个方法,借助这5个方法lua几乎可以使用所有的java类了


1. newInstance(className, ......)

第一个参数是类名,后面的是构造方法参数

例子:

obj = luajava.newInstance("java.lang.Object")

-- obj is now a reference to the new object

-- created and any of its methods can be accessed.


-- this creates a string tokenizer to the "a,b,c,d"

-- string using "," as the token separator.

strTk = luajava.newInstance("java.util.StringTokenizer",

   "a,b,c,d", ",")

while strTk:hasMoreTokens() do

   print(strTk:nextToken())

end



输出:

a

b

c

d


2. bindClass(className)

这个方法是用来调用类的静态方法的,返回一个java class

例子:

sys = luajava.bindClass("java.lang.System")

print ( sys:currentTimeMillis() )


-- this prints the time returned by the function.


3. new(javaClass)

这个方法可以接受一个java class对象然后new出一个instance

应该是和bindClass()绑定使用的


例子:

str = luajava.bindClass("java.lang.String")

strInstance = luajava.new(str)


4. createProxy(interfaceNames, luaObject)

这个是使用java接口的方法。luaObject中实现java接口中的方法,然后

调用creatProxy来构建出这个接口的lua版本,相当于用luaObject来实现

java接口了。


可以多个接口同时调用,然后luaObject实现所有这些接口的方法


例子:

button = luajava.newInstance("java.awt.Button", "execute")

button_cb = {}

function button_cb.actionPerformed(ev)

. . .

end


buttonProxy = luajava.createProxy("java.awt.ActionListener",

   button_cb)


button:addActionListener(buttonProxy)


5. loadLib(className, methodName)

在lua中使用java Libraries,这个方法我目前还没怎么搞懂


0 0
原创粉丝点击