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

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

当中,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);

上面的代码和以下的代码相当:

    intent.setFlags(intent,intent.FLAG_ACTIVITY_NEW_TASK);

假设写成:

intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);

就会返回错误:

Not a valid OO function call

由于第一个參数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里的一个静态类,所以不能写成:sk.kottman.androlua.R.id:







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

android.view.View$OnClickListener

Android平台下使用lua调用Java代码经验总结的更多相关文章

  1. Android的WebView通过JS调用java代码

    做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录 ...

  2. android webView开发之js调用java代码示例

    1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...

  3. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

  4. lua调用java java调用lua[转载]

    转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...

  5. 【转】Android平台下利用zxing实现二维码开发

    http://www.cnblogs.com/dolphin0520/p/3355728.html 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描 ...

  6. Android平台下利用zxing实现二维码开发

    Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...

  7. lua调用java过程

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

  8. (转载)Android平台下利用zxing实现二维码开发

    Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...

  9. Android与JNI(三) ---- c++调用java(转载)

    源码下载:JniDemo JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活 ...

随机推荐

  1. HDU 2852 KiKi's K-Number

    权值线段树 #include <cstdio> #include <cstring> const int N=200000,M=220000; int k,q,x,y,sum[ ...

  2. CCPC L(水)

    Huatuo's Medicine Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

  3. 【网络协议】TCP中的四大定时器

    前言 对于每个TCP连接,TCP一般要管理4个不同的定时器:重传定时器.坚持定时器.保活定时器.2MSL定时器. 重传定时器 非常明显重传定时器是用来计算TCP报文段的超时重传时间的(至于超时重传时间 ...

  4. 【剑指offer】面试题43:n个骰子的点数

    第一种思路是,每一个骰子的点数从最小到最大,如果为1-6,那么全部的骰子从最小1開始,我们如果一种从左向右的排列,右边的最低,索引从最低開始,推断和的情况. def setTo1(dices, sta ...

  5. mysql待整理

    1. MYSQL SQL_NO_CACHE的真正含义 http://www.dewen.org/q/5149/Mysql 是 结果不缓存,但查询还是缓存了. 如果要重新测试,就在查询前先执行一下&qu ...

  6. 10个JavaScript小技巧

    1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做 ...

  7. ansible笔记

    ansible 资料 ansible 配置 ansible inventory配置文件 ansible模块 http://www.cnblogs.com/iois/p/6216936.html ans ...

  8. C++之类的静态变量

    成员变量 通过对象名能够访问public成员变量 每个对象都可以有只属于自己的成员变量 成员变量不能在对象之间共享 类的静态成员 静态成员变量  存储在   全局数据区 #include<std ...

  9. SDWebImage 常用方法

    SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView自动去加载并显示网络图片.特别是在UITableViewCell中有UIImageView需要 ...

  10. 转:你真的懂得JS吗?

    题目1 if (!("a" in window)) { var a = 1; } alert(a); // undefined, ~~~所有全局变量都是window的属性,声明语句 ...