调用lua脚本
LuaJava实际上就是按照Lua官方文档, 把Lua的C接口通过JNI包装成Java的库. 下载, 里面是一个.dll, 一个.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld运行OK.
但是, 测试的时候, 很快发现了第一个问题: 在调用LuaJava中提供的LuaState.pushInteger方法的时候, 出现了错误 :Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是没有问题. 用Depends工具看了下, 这个.dll居然没有导出pushInteger这个函数。
(1).下载LuaJava的源代码, 查看了下Luajava.c 和 Luajava.h, 发现果然里面有点问题, 在.h里面定义了JNI中对应Java函数的C函数
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中没有实现这个函数. 无语, 看来大马虎哪都有啊. 幸亏有源代码, 照猫画虎在Luajava.c中加上这个函数的实现,
(2).然后编译. 编译也出现了问题了, 官方文档中说可以用VC++来Build, 但是没有说官方用的是什么版本. 我用VC2005就不行. 好在Luajava比较小, 就一个.h 一个 .c , 在VC中新建一个.dll项目, 把文件加进去, 修改一下build参数 (Include 需要加上lua的头文件, lib中需要加上lua的.lib文件, 另外要选上Compile as C Code (/TC)) Build, 通过了.
这时再在Java中调用pushInteger方法就没有问题了.
在测试中, 发现Luajava提供的文档中, 对于Lua脚本怎么调用Java对象/方法很详细, 但是在Java中怎么调用Lua函数/取得返回值 就没有. 参考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction的Lua C文档, 实现了传递对象到Lua中并取得返回值的代码:
Test1: 测试传递简单类型, 并取得返回值:
Lua 脚本(test.lua):
function test(a,b)
return a+b
end
Java代码:
static {
//加载Lua5.1.dll, 因为LuaJava最后还是要调用Lua的东西
System.loadLibrary("lua5.1");
}
public static void main(String[] argu) throws LuaException {
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
//读入Lua脚本
int error = L.LdoFile("test.lua");
if (error != 0) {
System.out.println("Read/Parse lua file error. Exit.");
return;
}
//找到函数test
L.getField(LuaState.LUA_GLOBALSINDEX, "test");
//参数1压栈
L.pushInteger(1);
//参数2压栈
L.pushInteger(2);
//调用!! 一共两个参数, 1个返回值
L.call(2, 1);
//保存返回值, 到a中
L.setField(LuaState.LUA_GLOBALSINDEX, "a");
//读入a
LuaObject l = L.getLuaObject("a");
//打印结果.
System.out.println("Result is " + l.getString());
L.close();
}
测试2: 传递Java对象
class Value {
public int i;
public void inc() {
i++;
}
public int get() {
return i;
}
public String toString() {
return "Value is " + i;
}
}
Lua脚本: (该脚本中调用两次对象的inc方法, 并调用get方法输出结果)
function test1(v)
v:inc();
v:inc();
print("In lua: " .. v:get());
return v
end
Java 代码: (前面都一样, 略)
//找到函数est1
L.getField(LuaState.LUA_GLOBALSINDEX, "test1");
//生成新的对象供测试
Value v = new Value();
//对象压栈
L.pushObjectValue(v);
//调用函数test1, 此时1个参数, 1个返回值
L.call(1, 1);
//结果放在b中.
L.setField(LuaState.LUA_GLOBALSINDEX, "b");
LuaObject l = L.getLuaObject("b");
System.out.println("Result is " + l.getObject());
总结:运行结果:
Result is Value is 2
In lua: 2
和预期的一致.
⑵ Lua脚本怎么样调用外部脚本
若要调用外部Lua脚本,需要使用dofile。
这很像C语言中的
#include“”
用法:dofile
("路径")
==================
--File:E:\lua1.lua
dofile
("Hello.lua")
print(a)
==================
--File:
E:\Hello.lua
a
=
100
==================
==输出==
100
⑶ 怎样在lua脚本中调用另一个lua脚本中的函数呢
require“函数脚本文件名字”
下面可以直接调用,也可以使用pcall方法安全调用
⑷ 关于在C++中调用lua脚本的几个简单问题、、求达人!3Q!
lua_State* p = lua_open();
//创建lua虚拟机的环境。#define lua_open() luaL_newstate()
luaopen_base(p);
luaopen_math(p);
luaopen_string(p);
//以上加入这些库,就像C包含头文件
lua_settop(p, 0);
//清空栈空间
lua_getglobal(p, "key");
//取一个全局变量为“key”,压入栈顶
int temp = lua_isstring(p, 1);
//当判断值是一个字符串或是一个数字(数字总能转换成字符串)时,返回 1 ,否则返回 0
const char* str = lua_tostring(p, 1);
//把栈顶的数据转换成字符串。这个函数没有出栈功能,
可以使用lua_pop(p,1)将栈顶元素弹出
lua_close(p);
//释放资源
⑸ 如何调用lua脚本进行防御快速入门
先编写 Lua脚本 /root/lua_script_modsecurity/ xss_detect.lua
vim xss_detect.lua
local string_find = string.find
local m_getvars = m.getvars
local m_log = m.log
function main()
⑹ 请问自己的软件如何运行Lua脚本
programming in lua 有相关的例子,一般脚本语言和c/c++之类的互相调用分两类,一类是扩展,就是将c/c++模块封装起来给脚本语言用,用swig做封装很方便的,一类是嵌入,就是在c/c++等应用中嵌入lua引擎,一般是用来分离经常变化的逻辑部分,比如WOW就是用lua语言作为扩展,用户可以编写lua脚本来完成一些特定功能的机器人。你要做的就是使用lua c api来在你的程序中执行lua。类似这种:
int iErr = 0;
lua_State *lua = lua_open (); // Open Lua
luaopen_io (lua); // Load io library
if ((iErr = luaL_loadfile (lua, "test.lua")) == 0)
{
// Call main...
if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
// Push the function name onto the stack
lua_pushstring (lua, "helloWorld");
// Function is located in the Global Table
lua_gettable (lua, LUA_GLOBALSINDEX);
lua_pcall (lua, 0, 0, 0);
}
}
lua_close (lua);
⑺ 关于vc6.0调用lua脚本问题
我把链接发送给你的邮件里。 Lua程序下载后完成
解压到任何文件夹上你的假设是d:\ LUA。
然后系统环境变量PATH里面添加广告:\ LUA从其他路径用分号分隔的。如何WIN环境变量,你到网上搜搜。
然后你开始处输入lua52 abc.lua开始的Lua语言解释器。
然后你了Lua扩展名的文件的打开方式,找到这个程序。
你双击lua文件可以被执行。
⑻ 如何在C++类型的工程中使用lua脚本
c++和lua混编的,工程主体是c++的,然后部分模块采用了Lua,方便热更。我们是新建了一个Lua工程,然后把之前c++工程的代码全部拷贝Lua工程里,在Lua工程里做一个CppLuaManager的管理器,可以直接调用运行lua脚本,往c++层加界面,传递数据,都可以。这样之前的c++工程代码也可以运行,新的lua代码也可以运行,就是交互数据的时候有点麻烦,不过基本满足我们项目的需求
⑼ 如何在JS中执行lua脚本
不可以的,lua只能在服务器上运行、无法在客户端运行,js是客户端脚本、在客户的浏览器上执行。
⑽ C++调用lua脚本 问题
',就可以调用了。看看error是什么,根据信息去调错。
lua编译器也就是解释器,所谓脚本就是加载时编译嘛!
另:调试脚本的方法就是靠log来分析了。lua调用函数当然用文本,要不怎么调。