Lua的所有库都是用C语言写的,所以Lua和C/C++的相互调用是天生就能实现的,但标准的Lua并不支持和Java的相互调用,值得庆幸的是某些大神帮我们做好了一个luajava库能实这一功能。这个库是怎么实现的,不属于我们的讨论范围,有兴趣的朋友们可以去百度一下~
进入正题:
实现相互调用的第一步就是去下载luajava库:
http://files.luaforge.net/releases/luajava/luajava
最新的版本就是2007年发布的LuaJava1.1版本(已经相当古老的,既然他这么就都不更新,应该就能说明它的可靠性了...其实不是这样的,后面会指出我这么说的原因)。选择1.1版本后可以下
luajava-1.1-win32-lua51.zip
这是可以直接用的,里面包括:luajava-1.1.dll和luajava-1.1.jar
接下来就是安置.dll和.jar文件了
1)将.dll放在你机子上JDK目录下的bin目录下(同java、javac命令文件在一起)
2).jar就作为你Java工程的引用库导入即可
附上一段演示代码(也是官方的示例):
- import org.keplerproject.luajava.LuaState;
- import org.keplerproject.luajava.LuaStateFactory;
- public class Main
- {
- public static void main(String[] args){
- LuaState L = LuaStateFactory.newLuaState();
- L.openLibs();
- L.LdoFile("hello.lua");
- System.out.println("Hello World from Java!");
- }
- }
代码的运行结果当然就是在控制台打印:Hello World from Java!
在Java使用lua和在C/C++中十分相似,多看看自带的文档应该很快就能习惯了。
接下来有一点要提醒大家,刚才下的文件中的luajava-1.1.dll是有缺陷的!!!
如果在Java里使用pushInteger就会发现编译器报错
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.keplerproject.luajava.LuaState._pushInteger(Lorg/keplerproject/luajava/CPtr;I)V
用Depends打开.dll就会发现它没有导出pushInteger函数。
再返回下载luajava的地方,下载
luajava-1.1.tar.gz
吧,这是该项目的源文件,我们需要自己来编译.dll。
下载完后解压,找到luajava-1.1\src\c里面只有一个luajava.c,查看源代码搜索下Integer会发现没有实现pushInteger这个函数(这就是我前面说的这个项目并“不可靠”的原因...)。我们需要自己添加该函数,仿照其他函数来改吧...
- JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
- (JNIEnv * env, jobject jobj, jobject cptr, jint i)
- {
- lua_State * L = getStateFromCPtr( env , cptr );
- lua_pushinteger(L, i);
- }
这里需要指出的是这个代码并不是我写的,是在网上搜到的,具体是哪位仁兄写的我忘了...请作者见谅哈~
除了luajava的源代码我们还需要lua的头文件
http://sourceforge.net/projects/luabinaries/files/5.1.4/Windows Libraries/
该下哪个版本里面已经写的很清楚了,这里不再赘述。下载完后需要注意放置路径(以lua5_1_4_Win32_vc10_lib.zip为例):将include文件夹下的文件都和luajava.c放到一起,并在该目录下新建lib文件夹,将lua5.1.lib放到lib文件夹中。
接下来写配置文件(以Windows为例),其实很简单就改一个地方就行。编辑config.win文件,将"LUA_DIR="后面的路径设成你本地Lua头文件所在的路径就行(如果是按我上面说的放置位置就是..luajava-1.1\src\c)。
接下来就可以进行编译了。
打开“Visual Studio 命令提示符(2010)”(VS的版本和下的lua头文件的版本对应)逐条写入一下两条命令:
- D:\luajava-1.1>"E:\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
- D:\luajava-1.1>nmake -f MakeFile.win
无论是命令提示符的当前路径还是第一条命令中vsvars32.bat所在的路径,都改成你本地的路径(路径中不要出现空格和汉字)。编译完成后会生成三个文件luajava.h、luajava-1.1.dll和luajava-1.1.jar,这里我们只需要luajava-1.1.dll,用它替换到之前下的那个.dll就可以正常使用了。
正常来说我们自己编译出来的.jar文件也是可以用的,但我编译出来不能用...可能是我的环境有点问题吧。在不同的环境下会出现不同的问题,请大家根据自己的情况灵活应对,实在不行的时候可以看看Makefile.win和config.win里面的代码,你会得到一些启发的。好了LuaJava的使用就介绍到这里,不足之处还望见谅~