使用 CLE 通过 Java 调用 Android Lua
本文介绍了一种使用 CLE 中间件从 Android 上的 Java 应用程序调用 Lua 的方法。
Java 是开发 Android 平台应用的主要语言。但是,在某些情况下,程序员希望从 Java 调用 Lua 代码来执行某些功能。有很多文章讨论这个主题。在这里,我们介绍另一种方法,它使用 CLE 中间件从 Android 平台的 Java 应用程序调用 Lua。
CLE(通用语言扩展)由 srplab 开发,它提供了辅助脚本之间多语言调用的函数,包括 Java、Python、Lua 等。Lua 引擎已被编译到 cle 核心库中。使用 CLE,Java 调用 Lua 代码变得非常容易。CLE 的架构如下:
Java 调用 Lua 函数
Lua 函数
Obj=Service:_New("TestClass");
function Obj:LuaAdd(x,y)
return x+y;
end
Java 代码
StarObjectClass a = Service._GetObject("TestClass")._New();
a._Call("LuaAdd",12,34));
Lua 回调 Java
Java 回调函数
StarObjectClass a = Service._GetObject("TestClass")._New()._Assign(new StarObjectClass(){
public int JavaAdd(StarObjectClass self,int x,int y){
return x+y;
}
});
Lua 代码
Obj:JavaAdd(x,y)
Java 获取 Lua 中定义的对象的属性
Lua: Obj.LuaValue = 200;
Java: a._Get("LuaValue")
Lua 获取 Java 中定义的对象的属性
Java : a._Set("JavaValue",100);
Lua : self.JavaValue
方法 1 源代码(将 CLE 集成到您的项目中)
- 从 http://code.google.com/p/cle-for-android 下载开发文件,然后打开 Eclipse。
- 创建一个 Android 项目。
- 将 CLE 库添加到项目,如下所示:
- Lua 代码
SrvGroup = libstarcore._GetSrvGroup() Service = SrvGroup:_GetService("","") --Create objects Obj=Service:_New("TestClass"); --Define functions function Obj:LuaAdd(x,y) print("Call lua function..."); return x+y; end --Call java functions function Obj:LuaPrint(x,y) print( "Value defined in java is ",self.JavaValue ); print( "Function result from java ",self:JavaAdd(x,y) ); end --define Attributes Obj.LuaValue = 200;<br />
- Java 代码
package com.cle.luafromjava; import android.app.Activity; import android.os.Bundle; import android.content.res.AssetManager; import java.io.IOException; import java.io.InputStream; import com.srplab.www.starcore.*; public class LuafromjavaActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //--init CLE StarCoreFactoryPath.InitDefault(Runtime.getRuntime(),"/data/data/com.cle.luafromjava"); StarCoreFactory starcore= StarCoreFactory.GetFactory(); StarServiceClass Service=starcore._InitSimple("test","123",0,0); Service._CheckPassword(false); AssetManager assetManager = getAssets(); try{ String luabuf; InputStream dataSource = assetManager.open("code.lua"); int size=dataSource.available(); byte[] buffer=new byte[size]; dataSource.read(buffer); dataSource.close(); luabuf=new String(buffer); Service._RunScript("lua",luabuf,"cmd",""); } catch(IOException e ){ } StarObjectClass a = Service._GetObject("TestClass")._New()._Assign(new StarObjectClass(){ public int JavaAdd(StarObjectClass self,int x,int y){ System.out.println("Call java function..."); return x+y; } }); a._Set("JavaValue",100); System.out.println(a._Get("LuaValue")); System.out.println(a._Call("LuaAdd",12,34)); a._Call("LuaPrint",56,78); } }
方法 2 源代码
(从 http://code.google.com/p/cle-for-android 独立安装 cle。)
- 从 http://code.google.com/p/cle-for-android/downloads/list 安装 CLE。
- 从 http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
- 创建一个 Android 项目。
- 将 starcore_android_r3.jar 添加到项目
- Lua 代码
与方法 1 相同 - Java 代码
删除以下代码行。其他与方法 1 相同。
StarCoreFactoryPath.InitDefault(Runtime.getRuntime(),"/data/data/com.cle.luafromjava");
可以从 http://www.srplab.com/android/calling_lua_from_java.rar 下载示例。