Android 调用 Lua /Lua 调用 Android 代码

在Android项目中使用Lua,需要两个步骤:

1、加载Lua脚本解析引擎。

2、以Native API方式调用引擎接口

直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua)对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的Java接口。


1.获取LuaJava 工程,引入到你的Eclipse中,并将其设为Library工程


2.将Lua解析器相关的C代码和 LuaJava的C代码打包成so文件


3.创建你demo工程,并引入LuaJava工程

a.布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">        <LinearLayout     android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_margin="10dp"    android:orientation="vertical" ><Button        android:id="@+id/executeLuaStatemanet"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="15dp"        android:text="运行Lua脚本语句" /><Button        android:id="@+id/executeLuaFile"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="15dp"        android:text="运行Lua脚本文件" />    <Button        android:id="@+id/callAndroidApi"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="15dp"        android:text="调用 Android API" />        <TextView        android:id="@+id/displayResult1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         android:layout_marginTop="5dp"/>        <TextView        android:id="@+id/displayResult2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         android:layout_marginTop="5dp"/>        <LinearLayout         android:id="@+id/layout"        android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginTop="5dp"    android:orientation="vertical">    </LinearLayout>    </LinearLayout>    <Button        android:id="@+id/clearBtn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:layout_margin="15dp"        android:text="清除结果" /></RelativeLayout>

b. Activity 代码

package com.open.lua;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import org.keplerproject.luajava.LuaState;import org.keplerproject.luajava.LuaStateFactory;import com.example.androidluatest.R;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends Activity {private LuaState mLuaState;//Lua解析和执行由此对象完成private TextView displayResult1;//用于演示,显示数据private TextView displayResult2;private LinearLayout mLayout;private static int count;        @Overrideprotected void onCreate(Bundle savedInstanceState)     {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);displayResult1 = (TextView)findViewById(R.id.displayResult1);displayResult2 = (TextView)findViewById(R.id.displayResult2);mLayout = (LinearLayout) findViewById(R.id.layout);findViewById(R.id.executeLuaStatemanet).setOnClickListener(listener);findViewById(R.id.executeLuaFile).setOnClickListener(listener);findViewById(R.id.callAndroidApi).setOnClickListener(listener);findViewById(R.id.clearBtn).setOnClickListener(listener);mLuaState = LuaStateFactory.newLuaState();mLuaState.openLibs();}             private OnClickListener listener=new OnClickListener() {@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.executeLuaStatemanet:executeLuaStatemanet();break;case R.id.executeLuaFile:executeLuaFile();break;case R.id.callAndroidApi:callAndroidAPI();break;case R.id.clearBtn:displayResult1.setText("");displayResult2.setText("");mLayout.removeAllViews();break;}}};private void executeLuaStatemanet() {mLuaState.LdoString(" varSay = 'This is string in lua script statement.'");// 定义一个Lua变量mLuaState.getGlobal("varSay");// 获取displayResult1.setText(mLuaState.toString(-1));// 输出}private void executeLuaFile() {mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile)));mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "functionInLuaFile");// 找到functionInLuaFile函数mLuaState.pushString("从Java中传递的参数");// 将参数压入栈// functionInLuaFile函数有一个参数,一个返回结果int paramCount = 1;int resultCount = 1;mLuaState.call(paramCount, resultCount);mLuaState.setField(LuaState.LUA_GLOBALSINDEX, "resultKey");// 将结果保存到resultKey中mLuaState.getGlobal("resultKey");// 获取displayResult2.setText(mLuaState.toString(-1));// 输出}private void callAndroidAPI() {mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile)));mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "callAndroidApi");// 找到functionInLuaFile函数mLuaState.pushJavaObject(getApplicationContext());mLuaState.pushJavaObject(mLayout);mLuaState.pushString("lua调用 android , TextView的数据:"+(++count));mLuaState.call(3, 0);}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 "";}}}

c. 位于raw目录下的Lua文件代码

function functionInLuaFile(key) return ' Function in Lua file . Return : '..key..'!'endfunction callAndroidApi(context,layout,tip)tv = luajava.newInstance("android.widget.TextView",context)tv:setText(tip)layout:addView(tv)end

d.效果图



demo工程:http://download.csdn.net/detail/zz7zz7zz/6584175


参考文章:http://my.oschina.net/chenyoca/blog/69169




更多相关文章

  1. C语言函数的递归(上)
  2. Android(安卓)Studio 下载安装以及不能打开的解决办法
  3. Space+onTouchEvent=Hitarea:像Flash那样在Android中扩大点击区域
  4. 一篇文章看明白 Android(安卓)图形系统 Surface 与 SurfaceFling
  5. Android(安卓)Adapter的那些事
  6. Android(安卓)studio禁用启动时自动更新SDK功能
  7. android 常用adb 和 adb shell 命令 获取root权限
  8. Android(安卓)-- AppWidget 高级篇
  9. android 自定义View开发实战(四) 圆角矩形ImageView实现

随机推荐

  1. Android 2020年最新保活方案 保活90% 已
  2. android实现ios形式的字体,实现各种自定义
  3. Android学习建议
  4. [Android Studio] Android Studio如何提
  5. 论“Android”在未来十年的发展
  6. Android React Native的使用细节问题
  7. Android 驱动之旅 第四章:在Android 系统
  8. Android(安卓)音视频深入 四 Android原生
  9. Android游戏可能遇到的3个问题及解决方案
  10. Android(安卓)三言两语