Skip to content

Instantly share code, notes, and snippets.

@MewX
Last active January 5, 2016 15:54
Show Gist options
  • Save MewX/21b6821495fca0a96b77 to your computer and use it in GitHub Desktop.
Save MewX/21b6821495fca0a96b77 to your computer and use it in GitHub Desktop.
Lua on Android
  1. 创建android项目,在asset资源文件夹下创建一个lua文件夹
  2. 新建一个lua文件,放到 asset\lua目录下,如asset\lua\hello.lua。

file1.lua

一个简单的函数,计算两个数相加

function plus(a, b) 
    return a + b;
end

file2.lua

一个稍微不太简单的简单的函数,参数是一个Java对象,函数内容是调用Java对象value的函数

function heihei(value)
    value:inc();
    value:inc();
    return value;
end
  1. 理论上,使用L.LdoFile("asset/lua/hello.lua");就可以加载lua文件了,但是实际上加载不成功(为什么?我暂时还不知道,要么等我变强,要么你去变强,然后告诉我,嘻嘻~)
  2. 呐,凡事呢,都有解决的办法,咱们用L.LdoString()函数来代替LdoFile()好不好?
  3. 怎么代替呢?对了聪明的你猜对了把hello.lua文件用IO流读取出来,然后保存到字符串里,然后就可以调用LdoString()函数了~

Java代码如下

public class HelloLuaActivity extends Activity {
 private final String TAG = "HelloLuaActivity";
         @Override
         public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                TextView txtView = (TextView)this.findViewById(R.id.helloTxt);
        
                LuaState L = LuaStateFactory.newLuaState();
                L.openLibs();
        
                L.LdoString(getLuaString("lua/hello.lua"));
  
               // 实例1.Java调用lua函数
                L.getField(LuaState.LUA_GLOBALSINDEX, "plus");    //取得lua里的plus函数
                L.pushNumber(12);      //传递参数1给plus函数
                L.pushNumber(2132);      //传递参数2给plus函数
                L.call(2, 1);       //调用plus函数
        
                L.setField(LuaState.LUA_GLOBALSINDEX, "a");   //将函数的结果保存到一个参数a中
                LuaObject obj = L.getLuaObject("a");    //取得参数a
        
                txtView.setText("" + obj.getString());    //打印参数a的值到TextView中
  
  
                // lua调用Java对象
                Value value = new Value();
                L.getField(LuaState.LUA_GLOBALSINDEX, "heihei");//获取(或者说,是定位?)lua的heihei函数
                try {
                   L.pushObjectValue(value);   //将value对象传递给heihei函数
                } catch (LuaException e) {}
                L.call(1, 1);     //调用heihei函数
                L.setField(LuaState.LUA_GLOBALSINDEX, "v"); //函数结果保存到参数v中
                LuaObject v = L.getLuaObject("v");  //读取参数v
                try {
                   txtView.setText("" + v.getObject());  //打印日志            } catch (LuaException e) {}
        
                L.close();     //关闭lua
    }
    //嘿嘿,注意咯,精华来了~这个函数就是用来读取lua文件,//然后保存到一个字符串里(当然,你可以用其他方法,只要能保存成字符串)
    private String getLuaString(String resPath) {
         InputStream isread = null;
         byte[] luaByte = new byte[1];
          try { //就是这里了,我们把lua 都放到asset目录下,这样系统就 //不会找不到文件路径了,哼~

             isread = this.getAssets().open(resPath);    
             int len = isread.available();
             luaByte = new byte[len];
             isread.read(luaByte);
          } catch (IOException e1) {

          } finally {
             if(isread != null) {
                try {
                   isread.close();
                } catch (IOException e) {}
             }
          }
  
          return EncodingUtils.getString(luaByte, "GBK");
    }  //一个简单的内部类 class Value {
       private int num = 0;
     
       public void inc() {
          num++;
       }
     
       public String toString() {
          return "num is " + num;
       } 
    }
}

java code

LuaState l = LuaStateFactory.newLuaState();
l.doFile("main.lua");
TestDataObject obj = new TestDataObject("test", 1, true);
System.out.println("before lua: " + obj.toString());
l.getGlobal("test");
l.pushJavaObject(obj);
l.call(1, 0);
System.out.println("after lua: " + obj.toString());

main.lua

function test (obj)
	obj:setString("lua")
	obj:setInt(2)
	obj:setBoolean(false)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment