`
fredguo
  • 浏览: 17184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android下调用lua脚本方法

阅读更多

在android里使用lua的文章网上已经有很多,这里就不具体说了。但网上大多数的例子只是简单的在java里调用了LdoString,很少有提到如何加载lua脚本文件。所以,这里主要说一下如何直接调用lua脚本文件的方法。我在网上查找到的方法以及自己研究后的结果整理如下:

 

lua脚本是文本文件,为了不让android将其编译成二进制的形式,一般将其放到res/raw下面或者assets下面。但在android里所有这些资源都是在apk包里的(本人经验不是很多,这是我目前所以理解的),所以不能够直接通过文件路径的方法访问,于是luajava的LdoFile也无法正常加载lua文件。那么只好通过变通的方式执行lua脚本了。

 

假设我们的lua文件为/res/raw/hello.lua(放在assets下也是同样的道理)

 

一、利用流读取lua脚本的内容并将其赋值给String变量,通过LdoString执行。

网上有类似的方法,整理如下:

L.LdoString(readStream(getResources().openRawResource(R.raw.hello)));

 其中getResources().openRawResource(R.raw.hello))返回的是hello.lua的文件流。

readStream是读取全部文件内容,并以String的类型返回,代码如下

private String readStream(InputStream is) {

		try {

			ByteArrayOutputStream bo = new ByteArrayOutputStream();

			int i = is.read();
			while (i != -1) {
				bo.write(i);
				i = is.read();

			}
			return bo.toString();
		} catch (IOException e) {
			Log.e("ReadStream", "读取文件流失败");
			return "";
		}

	}
 这样就可以通过LdoString的方式执行lua脚本了。  

 

二、将lua脚本复制到files文件夹下,再执行LdoFile

该方法主要是将apk中的lua文件复制出来,以便让程序能够通过文件路径的方式访问到脚本,进而可以执行LdoFile方法。

private void copyResourcesToLocal() {
		String name, sFileName;
		InputStream content;
		R.raw a = new R.raw();
		java.lang.reflect.Field[] t = R.raw.class.getFields();
		Resources resources = getResources();
		for (int i = 0; i < t.length; i++) {
			FileOutputStream fs = null;
			try {
				name = resources.getText(t[i].getInt(a)).toString();
				sFileName = name.substring(name.lastIndexOf('/') + 1, name
						.length());
				content = getResources().openRawResource(t[i].getInt(a));

				// Copies script to internal memory only if changes were made
				sFileName = getApplicationContext().getFilesDir() + "/"
						+ sFileName;

				Log.d("Copy Raw File", "Copying from stream " + sFileName);
				content.reset();
				int bytesum = 0;
				int byteread = 0;
				fs = new FileOutputStream(sFileName);
				byte[] buffer = new byte[1024];
				while ((byteread = content.read(buffer)) != -1) {
					bytesum += byteread; // 字节数 文件大小
					System.out.println(bytesum);
					fs.write(buffer, 0, byteread);
				}
				fs.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

 

copyResourcesToLocal的作用是复制lua文件。这是我在ScriptForAndroidTemplate工程看到的,它的方法就是将脚本文件直接复制到脚本解释器的目录下。

当然,这里我没有判断lua文件是否已经存在以及文件是否有变化,真正的程序里最好加上判断,当真的需要复制文件时再进行复制。

copyResourcesToLocal方法需要放在执行luajava的方法的前面,可以是onCreate开始的位置。之后就可以调用luajava的LdoFile方法了

L.LdoFile(getApplicationContext().getFilesDir() + "/" + "hello.lua");

 

下面贴一个本身测试用的完整的Activity

package helloandroid.test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;
import android.util.Log;

import org.keplerproject.luajava.*;

public class Helloandroid extends Activity {

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		copyResourcesToLocal();
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		LuaState L = LuaStateFactory.newLuaState();
		System.out.println("Lua:newLuaState");

		L.openLibs();
		System.out.println("Lua:openLibs");

		try {
			L.pushObjectValue(Log.class);
			L.setGlobal("Log");
		} catch (LuaException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// String lua = this.getClass().getResource("").getPath();
		System.out.println("Lua script: "
				+ getResources().getString(R.raw.hello));
		System.out.println("path: "
				+ getApplicationContext().getPackageCodePath() + "/"
				+ getResources().getText(R.raw.hello).toString());
		int luaerr = L.LdoFile(getApplicationContext().getFilesDir() + "/"
				+ "hello.lua");
		// System.out.println("Lua:LdoString");
		// getResources().getResourceName(R.raw.hello);
		// int luaerr =
		// L.LdoString(readStream(getResources().openRawResource(R.raw.hello)));
		System.out.println("Lua:LdoFile error " + luaerr);
		L.getGlobal("text");
		System.out.println("Lua:getGlobal");
		String text = "default content";
		text = L.toString(-1);
		L.getGlobal("chinese");
		text += L.toString(-1);
		// L.pop(2);
		super.onCreate(savedInstanceState);
		TextView tv = new TextView(this);
		tv.setText(text);
		L.getGlobal("setcontent");
		try {
			L.pushObjectValue(tv);
		} catch (LuaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		L.pcall(1, 0, 0);
		setContentView(tv);
	}

	/**
	 * 读取输入流的全部字节,并以String形式返回
	 * 
	 * @param is
	 * @return
	 */
	private String readStream(InputStream is) {

		try {

			ByteArrayOutputStream bo = new ByteArrayOutputStream();

			int i = is.read();
			while (i != -1) {
				bo.write(i);
				i = is.read();

			}
			return bo.toString();
		} catch (IOException e) {
			Log.e("ReadStream", "读取文件流失败");
			return "";
		}

	}

	/**
	 * 将/res/raw下面的资源复制到 /data/data/applicaton.package.name/files
	 */
	private void copyResourcesToLocal() {
		String name, sFileName;
		InputStream content;
		R.raw a = new R.raw();
		java.lang.reflect.Field[] t = R.raw.class.getFields();
		Resources resources = getResources();
		for (int i = 0; i < t.length; i++) {
			FileOutputStream fs = null;
			try {
				name = resources.getText(t[i].getInt(a)).toString();
				sFileName = name.substring(name.lastIndexOf('/') + 1, name
						.length());
				content = getResources().openRawResource(t[i].getInt(a));

				// Copies script to internal memory only if changes were made
				sFileName = getApplicationContext().getFilesDir() + "/"
						+ sFileName;

				Log.d("Copy Raw File", "Copying from stream " + sFileName);
				content.reset();
				int bytesum = 0;
				int byteread = 0;
				fs = new FileOutputStream(sFileName);
				byte[] buffer = new byte[1024];
				while ((byteread = content.read(buffer)) != -1) {
					bytesum += byteread; // 字节数 文件大小
					System.out.println(bytesum);
					fs.write(buffer, 0, byteread);
				}
				fs.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

 hello.lua脚本的内容为:

text="I am in lua Script\n"
chinese="我是中文,娃哈哈 "

function setcontent(view)
    view:setText(text..chinese.."\nthis is setcontent")
    Log:i("LuaLog", "over setcontent")
end

print "end of lua script"
 

以上就是本人总结的方法,恳请各位拍砖

分享到:
评论

相关推荐

    android Lua脚本 文件

    在Android平台上,Lua是一种轻量级的脚本语言,它被广泛用于游戏开发、自动化任务以及简化复杂的程序逻辑。本文将深入探讨如何在Android环境中运行Lua脚本,执行Lua脚本文件,以及如何调用Android API,以实现与...

    浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    ### 浅析Android手游Lua脚本的加密与解密(番外篇之反编译的对抗) #### 一、引言 随着移动游戏行业的迅速发展,越来越多的游戏开发者选择使用Lua脚本来开发游戏逻辑,主要是因为它易于学习、轻量级、执行效率高...

    Android-使用lua语言开发Android应用

    在Android开发领域,使用Lua语言来开发应用是一种有效的技术手段,尤其对于想要实现跨平台、高效性能和小体积应用的开发者来说。本文将深入探讨如何利用Lua进行Android应用开发,以及这种方式带来的优势。 首先,...

    SpringBoot+Redis执行lua脚本的方法步骤

    SpringBoot+Redis 执行 Lua 脚本的方法步骤 以下是 SpringBoot+Redis 执行 Lua 脚本的方法步骤的知识点总结: 1. 背景:在开发中,我们需要一次性操作多个 Redis 命令,但是这些操作不具备原子性,而 Redis 的事务...

    LUA脚本|LUA脚本支持库

    了解并熟练使用这些LUA脚本支持库,开发者可以极大地提升开发效率,编写出功能丰富、性能优秀的LUA程序。同时,持续关注和学习新的库版本,能够保持代码的先进性和可维护性,从而在IT行业中保持竞争力。

    lua脚本问文件哈哈哈

    lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问文件哈哈哈lua脚本问...

    delphi调用lua脚本的一个例子

    在本文中,我们将深入探讨如何在Delphi编程环境中调用Lua脚本,以实现更灵活的逻辑处理和功能扩展。Delphi是一款强大的Object Pascal集成开发环境(IDE),而Lua则是一种轻量级、高效的脚本语言,常用于游戏开发和...

    lua脚本执行行数和次数统计Dll

    提供的例子文件`test.lua`是一个很好的起点,它展示了如何在实际的lua脚本中使用LuaProfiler。通过运行这个示例,你可以看到LuaProfiler如何工作,以及如何解析生成的统计结果。 总的来说,LuaProfiler是一个强大的...

    游戏引擎HGE结合Lua脚本 教程.zip

    用Hge && Lua写游戏.txt”可能详细阐述了如何将HGE游戏引擎与Lua脚本结合,创建游戏的基本步骤。这可能包括设置项目、加载资源、处理事件、更新游戏状态和渲染画面等。 “1.lua环境配置 lua for windows (lfW).txt...

    基于串口屏LUA脚本—系统参数设置功能V1.0.pdf

    标题《基于串口屏LUA脚本—系统参数设置功能V1.0》所涉及的知识点主要集中在如何使用LUA脚本语言来设置和控制串口屏上的系统参数。串口屏一般指的是一种可以通过串行通信接口连接的显示设备,其上可以运行LUA脚本,...

    visual c++ HGE游戏引擎+Lua脚本的结合使用.zip

    本文将深入探讨如何将Visual C++、HGE游戏引擎和Lua脚本进行结合使用,以实现更高效的游戏开发。 一、HGE游戏引擎的介绍与使用 HGE,全称Happy Game Engine,是一个跨平台的游戏开发库,支持Windows、Linux和...

    一个用lua写的游戏脚本实例

    "游戏脚本设计与实现" ...从提供的游戏脚本实例中,我们可以了解到游戏脚本设计的基本结构、游戏任务的设计、游戏机制的实现、游戏逻辑的编写、lua语言在游戏脚本中的应用、游戏脚本的优化和游戏脚本的测试等知识点。

    lua脚本源码包

    在这个源码包中,"lua_test"是一个用C++编写的测试程序,它展示了如何在C++项目中集成和调用Lua脚本。在Visual Studio 2008中,你可以打开这个项目,查看其源代码,理解如何设置Lua环境,如何加载和运行lua脚本,...

    STM32F103 运行lua脚本例程.rar

    为了在STM32F103上运行Lua,首先需要一个经过优化的Lua编译版本,可能需要使用交叉编译工具链来生成适合微控制器的二进制代码。然后,需要在STM32的存储器中安排lua解释器和脚本的存储位置,通常包括RAM和Flash。...

    Lua 脚本

    Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用...

    【安卓Android】利用lua脚本终端命令添加微信好友

    【安卓Android】利用lua脚本终端命令添加微信好友 https://blog.csdn.net/weixin_53403301/article/details/140045162 这里仅演示lua脚本命令的快速调试方式 以便于lua语言的开发 该方法不一定合规 仅供开发使用 ...

    Cocos2d-x 如何使用Lua脚本

    5. **调用Lua函数**:如果需要在Lua脚本中定义函数并从C++调用,可以使用`cocos2d::CCScriptEngineProtocol::callFunction("lua_function_name", args...)`,其中`lua_function_name`是Lua中的函数名,`args...`是...

    lua与Android交互,基本实现

    在Android开发中,有时我们需要使用脚本语言来增强应用的灵活性和可扩展性,而Lua就是这样一种轻量级、高效且易于学习的脚本语言。本文将深入探讨如何在Android应用中集成Lua,并实现Android与Lua之间的交互。 一、...

Global site tag (gtag.js) - Google Analytics