日期:2014-05-16  浏览次数:20811 次

Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)
依赖包(附件有下载):
包名类型操作系统
luajava-1.1.jarjarALL
libluajava-1.1.so.solinux
luajava-1.1.dll.dllwindows


windows:
将luajava-1.1.dll拷贝到java.libary.path目录(通过System.getProperty("java.library.path")可以知道)

linux:
将libluajava-1.1.so拷贝到java.libary.path目录(通过System.getProperty("java.library.path")可以知道)

如果linux有问题,则按以下操作重新编译.so文件

1.编译&安装Lua
tar -zxvf lua-5.1.5.tar.gz
cd lua-5.1.5
make linux install
注:64位系统需要先编辑src/Makefile,在CFLAGS上添加-fPIC。

2.编译与安装Luajava
tar -zxvf luajava-1.1.tar.gz
cd luajava-1.1
修改 config文件,添加JAVA_HOME=/broadtech/javaweb/jdk1.6.0_25
make

3.部署。
将编译好的libluajava-1.1.so拷贝到java.libary.path目录(通过System.getProperty("java.library.path")可以知道),
luajava-1.1.jar拷贝到$JAVA_HOME\jre\lib\ext目录

4、重启项目

注:LuaJava1.1缺少了JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger (JNIEnv * env , jobject jobj , jobject cptr , jint number) 方法的实现,编译前可编辑src/c/luajava.c加入以下代码实现再make

/************************************************************************
*   JNI Called function
*      Lua Exported Function
************************************************************************/
 
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
  (JNIEnv * env , jobject jobj , jobject cptr , jint number)
{
   lua_State * L = getStateFromCPtr( env , cptr );
 
   lua_pushinteger( L, ( lua_Integer ) number );
}


LuaUtil.java
/**
 * 调用Lua脚本
 * @author chamcon
 * @date 2013-11-07 15:58:48
 */
public class LuaUtil {
	public static List<String> PUBLIC_LUA_FILES = new ArrayList<String>();
	public static Logger logger = Logger.getLogger(LuaUtil.class);
	
	static {
		//配置公共函数lua文件
		//PUBLIC_LUA_FILES.add("");
	}
	
	/**
	 * 执行Lua脚本
	 */
	public static String execLuaFunc(String lua,String funcName,String value){
		//依赖库文件要放到java.library.path下
		logger.debug("java.library.path:"+System.getProperty("java.library.path"));
		
		LuaState L = LuaStateFactory.newLuaState();
		// 加载lua标准库,否则一些lua基本函数无法使用
		L.openLibs();
		
		//加载公共函数文件
		if(!PUBLIC_LUA_FILES.isEmpty()){
			for(int i=0;i<PUBLIC_LUA_FILES.size();i++){
				L.LdoFile(PUBLIC_LUA_FILES.get(i));
			}
		}
		
		//加载函数串
		L.LdoString(lua);
		//调用函数名
		L.getField(LuaState.LUA_GLOBALSINDEX, funcName);
		//设置参数
		L.pushString(value);
		
		//调用
		L.call(1, 1);
		
		//设置返回对象
		L.setField(LuaState.LUA_GLOBALSINDEX, "RESULT");
		LuaObject lobj = L.getLuaObject("RESULT");
		 
		//获取返回值
		String res = lobj.getString();
		L.close();

		if(res == null) return "";
		return res;
	}
}

本文链接:http://chamcon.iteye.com/blog/1972995
参考:http://www.chinasb.org/archives/2013/06/5115.shtml