65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CLE 通过 Java 调用 Android Lua

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012年3月1日

CPOL

1分钟阅读

viewsIcon

23073

本文介绍了一种使用 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 集成到您的项目中)

  1. http://code.google.com/p/cle-for-android 下载开发文件,然后打开 Eclipse。
  2. 创建一个 Android 项目。
  3. 将 CLE 库添加到项目,如下所示:

  4. 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 />
  5. 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。)

  1. http://code.google.com/p/cle-for-android/downloads/list 安装 CLE。
  2. http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
  3. 创建一个 Android 项目。
  4. starcore_android_r3.jar 添加到项目
  5. Lua 代码
    与方法 1 相同
  6. Java 代码

    删除以下代码行。其他与方法 1 相同。

    StarCoreFactoryPath.InitDefault(Runtime.getRuntime(),"/data/data/com.cle.luafromjava");

可以从 http://www.srplab.com/android/calling_lua_from_java.rar 下载示例。

使用 CLE 从 Java Android 调用 Lua - CodeProject - 代码之家
© . All rights reserved.