分享

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

 quasiceo 2016-12-18

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


热度4 评论 63
www.BkJia.Com  网友分享于:       浏览数39443次

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


动态语言以其运行的灵活性,可配置性,方便调试可以为开发带来极大的方便,如果用好了,可以极大的提高开发的效率。


怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的。


其中,lua以其小巧,灵活,方便扩展,方便嵌入被用于大多数的游戏开发中。


对于我来说,对于一个充分认识到动态的力量的人来说,在软件开发里集成一种脚本语言成为一种很重要的很有意义的工作。


但是在Android平台,在试过Python后,发现虽然集成也不是什么困难的事,但是感觉它还是有点大,一个动态库就有3M多,python库还得自己去裁剪,


编译也不是很方便。所以最近把注意力渐渐的放到了lua这种工具上。对比了下lua,虽然lua没有像Python那么纯粹,但是感觉这种劣势反到是成了它的优势。


不得不说在Android平台上,lua比python更实用。正所谓,没有最好,只有最合适。Python在追求纯粹的同时,却也阻碍了它的发展。


对于每个视效率为生命的开发人员来说,方便实用才是王道。


因为这意味着可以尽快的完成软件的开发,可以降低软件开发的风险,可以少些开发的压力,可以少熬些夜,可以多点陪女朋友的时间(哈,程序员那有女朋友啊)。


扯远了,回到标题,看下如何在Android平台上用luajava来使lua和java融为一体。


luajava在android平台上已经有了移植,代码可以从https://github.com/mkottman/AndroLua下载。


至于编译和把luajava加入自己的项目中,不多讲,参考AndroLua的代码就可以了。下面来关注一下如何用lua来和android进行交互:



最简单的一个例子:


function launchSetting(context)
    intent = luajava.newInstance("android.content.Intent")
    c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings")
    intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
    intent:setComponent(c)
    context:startActivity(intent)
end






该示例可以用来启动“设置”


一行一行来解释下:
    intent = luajava.newInstance("android.content.Intent")


创建一个Intent实例:相当于Java里的 Intent intent = new Intent()


    c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings")


创建一个ComponentName实例,相当于Java代码:ComponentName c = new ComponentName("com.android.settings", "com.android.settings.Settings")


    intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
启动一个新的Activity实例


    intent:setComponent(c)
    context:startActivity(intent)
启动Activity




刚开始学lua的同学可能对"."和":"的有些陌生。这里简单解析一下,"."是用来调用类的方法或变量(静态方法),而":"是用来调用对象的方法。
请看下面这行代码:
    intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
因为FLAG_ACTIVITY_NEW_TASK是Intent的一个静态变量,所以必须这样调用:


intent.FLAG_ACTIVITY_NEW_TASK


如果写成:


intent:FLAG_ACTIVITY_NEW_TASK


就错了。


还有,上面的代码和下面的代码相当:
    intent.setFlags(intent,intent.FLAG_ACTIVITY_NEW_TASK);






再来看一个例子:


require 'import'


button_cb = {}
function button_cb.onClick(ev)
    print('hello,world')
    launchSetting(activity)
end


local id = luajava.bindClass("sk.kottman.androlua.R$id")
local launch = activity:findViewById(id.launchButton)


buttonProxy = luajava.createProxy("android.view.View$OnClickListener", button_cb)
launch:setOnClickListener(buttonProxy)




这个例子展示了luajava.createProxy的使用,该例子注册了一个按扭的Click的Listener


注意以下代码:
local id = luajava.bindClass("sk.kottman.androlua.R$id")
local launch = activity:findViewById(id.launchButton)


因为id是R.java里的一个静态类,所以引用Button的资源文件用下面的代码:


id.launchButton


而不是id:launchButton


另外,注意类中类的引用方法,如:


android.view.View$OnClickListener












lua怎调用java程序

Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的)。Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率、增强你的程序可扩展性。

首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库。我使用的是一个叫做LuaJava的开源项目,可以在: www.keplerproject.org/luajava/ 找到LuaJava的类库以及源代码,使用文档资等

下载下来解压后包括两个文件(我下载的是1.1版本的): luajava-1.1.jar 文件和 luajava-1.1.dll动态连接库文件

luajava-1.1.jar就容易了,就是将其加入你的项目的ClassPath中,以便程序可以使用它提供的API

luaJava-1.1.dll就麻烦了,你必须将其加入你的Windows安装目录下,比如你用的是XP,安装在C盘,那就直接将其加入C:\WINDOWS目录下即可,当然你也可以将其加入你的JDK下的jre下

好了,现在你的项目就可以使用Lua脚本来实现动态扩展功能了!不过不要急,你还得有工具来写Lua脚本吧?不可能用记事本来写吧???????

你可以使用UltraEdit,但你用UE打开lua文件后,会发现和记事本差不多,并没有高亮(可能新版本的支持Lua脚本了),如果你的UE不支持,那么先去UltraEdit的官网下载支持Lua的Wordfiles文件(www.ultraedit.com/files/wf/lua.txt),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。

但你如果是Java开发者,应该都用过Eclipse吧?可否在Eclipse下直接就写Lua脚本呢?答案是可以的!

这当然是Eclipse的强大的插件管理功能啦,你可以去下载luaeclipse插件来使你的Eclipse拥有编写Lua脚本的能力(既可以高亮显示你的脚本,是不是很爽呢),你可以在这里下载:www.ideais.com.br/luaeclipse/

下载后安装后,你的Eclipse就可以建立和编写Lua脚本了,注意设置一下首选项中关于LUA的属性(Eclipse安装插件就不用我说了吧????)

好了,现在一切都准备好了,让我们来一个HelloWorld吧!

首先在......余下全文>>
 

在android下使用lua,lua调用c++编译好的so里的一个函数,这个函数又调用lua里的一个函数

没听说过lua入栈太多自动弹出栈的功能,只碰到过超过设定的堆栈最大层数提示too many nested functions或者stack overflow。楼主的提示在lua源码里也没搜到。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多