搞了一整天几乎要发狂了,终于完成了一点点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,这个方法我目前还没怎么搞懂