Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MewX/bb2f9a257362d81ac417 to your computer and use it in GitHub Desktop.
Save MewX/bb2f9a257362d81ac417 to your computer and use it in GitHub Desktop.
AndroLua usage sample
package x.javaplus.util.lua;
import org.keplerproject.luajava.LuaException;
import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;
/**
* 一个lua操作
* @author deng
* @date 2015-7-13 下午9:37:46
*/
public class Lua {
private static Class<?> clazz = null;
/**
* 设置lua中打印对象
* @param c
*/
public static void setLogClass( Class<?> c ){ clazz = c; }
// lua对象
private LuaState luaState;
/**
* 创建一个lua
* @param filePath 文件路径
*/
public Lua( String filePath ) {
luaState = LuaStateFactory.newLuaState();
luaState.openLibs();
registerObject( clazz, "Logs" );
luaState.LdoFile( filePath );
}
public void close() { luaState.close(); }
/**
* 为lua里面注册对象
* @param obj ( 对象 )
* @param name ( 在lua中调用名 )
*/
public void registerObject( Object obj, String name ){
try {
luaState.pushObjectValue( obj );
luaState.setGlobal( name );
} catch (LuaException e) { e.printStackTrace(); }
}
/**
* 获取函数
* @param funName
* @return
*/
public Function getField( String funName ) {
// 获取lua中的函数
luaState.getField( LuaState.LUA_GLOBALSINDEX, funName );
return new Function();
}
public final class Function{
private Function(){};
/**
* 运行函数
* @param retlen 返回值个数
* @param args 参数
* @return
*/
public LuaValue[] call( int retlen, Object ... args ){
// 参数压栈
int len = args.length;
try {
for( int i = 0; i < len; i++ ){
luaState.pushObjectValue( args[i] );
}
} catch (LuaException e) { e.printStackTrace(); }
// 调用!! 一共len个参数, retlen 返回值
luaState.call( len, retlen );
if( retlen == 0 ) return null;
LuaValue[] ret = new LuaValue[retlen];
// 保存返回值, 到 ret 中
for( int i = 0; i < retlen; i++ ){
luaState.setField(LuaState.LUA_GLOBALSINDEX, "ret" + i );
try {
ret[retlen-i-1] = new LuaValue( luaState.getLuaObject( "ret" + i ) );
} catch (LuaException e) {
e.printStackTrace();
}
}
luaState.close();
return ret;
}
}
}
package org.mewx.projectprpr.plugin;
import org.keplerproject.luajava.JavaFunction;
import org.keplerproject.luajava.LuaException;
import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;
/**
* This class contains the functions that 'LuaJava' provides.
*
* LuaJava provides these functions:
* - Java run lua codes;
* - Java call lua functions, with args and returns;
* - Lua call java functions, with args, 'result' return;
* Created by MewX on 1/19/2016.
*/
@SuppressWarnings("unused")
public class JavaCallLuaJava {
static {
final String libLuaJavaName = "luajava";
System.loadLibrary(libLuaJavaName);
}
LuaState luaState;
String returnValue;
/**
* Construct does the initial job.
*/
public JavaCallLuaJava() {
luaState = LuaStateFactory.newLuaState();
luaState.openLibs();
if(!bindAllOpenFunctions())
close(); // fail to bind data
}
public void close() {
luaState.close();
}
public LuaState getLuaState() {
return luaState;
}
private boolean bindAllOpenFunctions() {
JavaFunction javaFunctionTest = new JavaFunction(luaState) {
@Override
public int execute() throws LuaException {
int stackHeight = 1;
for (int i = stackHeight; i <= luaState.getTop(); i++) {
// if in dev mode, this part should check type
int type = luaState.type(i);
String stype = luaState.typeName(type);
String val = null;
Object obj = luaState.toJavaObject(i);
if (obj != null)
val = obj.toString();
// For helloLuaJavaCallFromLua()
if(val != null)
returnValue = val.toUpperCase(); // get return value
// For helloLuaJavaCallFromLuaWithReturn()
luaState.pushString(returnValue);
luaState.setGlobal("result");
}
return 0;
}
};
try {
javaFunctionTest.register("test");
return true;
} catch (LuaException e) {
e.printStackTrace();
return false;
}
}
public String helloLuaJavaCallFromLua() {
luaState.LdoString("test(\"test lua\")");
return returnValue;
}
public String helloLuaJavaCallFromLuaWithReturn() {
luaState.LdoString("test(\"test lua\");a=result;");
return luaState.getLuaObject("a").toString();
}
public String helloLuaJava() {
luaState.LdoString("a=\"test lua\"");
return luaState.getLuaObject("a").toString();
}
}

Managed to get this working by removing some of the error handling code as noted in the luajava examples that seemed to interfere and swapping call to L.LLloadString to L.LdoString(src); and L.pcall to L.call.

public String runLuaHello(String src, String arg) throws LuaException {
    //init 
    L = LuaStateFactory.newLuaState();
    L.openLibs();
    L.setTop(0);
    //load the lua source code
    int ok = L.LdoString(src);
    if (ok == 0) {
        //don't quite understand why it's getGlobal? but here you set the method name
        L.getGlobal("hello");
        //send the arg to lua
        L.pushString(arg);
        //this specifies 1 arg and 1 result
        L.call(1, 1);
        //get the result
        String result = L.toString(-1);
        //pop the result off the stack
        L.pop(1);
        return result;
    }
    throw new LuaException(errorReason(ok) + ": " + L.toString(-1));
}

From http://stackoverflow.com/questions/17047003/passing-string-arg-to-lua-method-with-luajava-in-androlua/17231619#17231619

package com.example.speccall.lua;
import org.keplerproject.luajava.LuaObject;
import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.util.Log;
public class LuaContext {
private static LuaState L=null;
private static LuaContext instance=null;
private TelephonyManager _tm=null;
public static void init(Context context){
if(instance==null){
instance=new LuaContext();
}
instance._tm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
L=LuaStateFactory.newLuaState();
L.openLibs();
try{
L.pushObjectValue(instance);
L.setGlobal("context");
}catch(Exception e){
Log.d("LuaContext", "Error cause:"+e.getMessage());
}
}
public static LuaState getInstatnce(){
return L;
}
public TelephonyManager getTelephonyManager(){
return _tm;
}
public void runCallback(LuaObject o){
if(o.isFunction()){
try{
o.call(new Object[]{"This message is form callback. Sub result is "});
}catch(Exception e){
Log.d("LuaContext",e.getMessage());
}
}
}
public void Log_i(String tag,String msg){
Log.i(tag, msg);
}
public void Log_d(String tag,String msg){
Log.d(tag, msg);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment