android下顺利加载Lua的2个小例子

其实这是蛮久之前写的, 从网易博客拷过来的,嘿嘿,自己写了东西,总喜欢多多分享~

话说,很久之前,我写了一个小教程,可以顺利地在android里使用lua~

但是,有个问题,就是,如果用LdoFile函数来读取lua脚本,就会一直找不到路径。

目前,我找到了一个可解燃眉之急的办法,当然喇,网上已经有这种方法了,我稍微整理一下。

首先,请确认你已经能够成功地在android上使用lua脚本,否则,你可以看看这篇文章:

[小教程]解决android中加入Lua脚本后安装APK报错的问题。 (置顶的日志)

好,开始。

1.创建android项目,在asset资源文件夹下创建一个lua文件夹

2.新建一个lua文件,放到 asset\lua目录下,如asset\lua\hello.lua。注意咯,我们要把lua文件放到asset目录,很重要~

 

--文件名:hello.lua

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

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


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

function heihei(value)
 value:inc();
 value:inc();
 
 return value;
end


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


 
7.试试看?成功了没?
8.好咯,这是笨木头的一个解决方法,不知道这样会不会有什么弊端,暂时这么做咯?
我相信,方法,一定会有的,不能放弃,加油~
 
参考文章(超级佩服作者,帮了我很大的忙):
http://yangzb.iteye.com/blog/560299
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值