Lua和Java的相互调用(配置)

     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工程的引用库导入即可

附上一段演示代码(也是官方的示例):

  1. import org.keplerproject.luajava.LuaState;
  2. import org.keplerproject.luajava.LuaStateFactory;
  3. public class Main
  4. {
  5.     public static void main(String[] args){
  6.         LuaState L = LuaStateFactory.newLuaState();
  7.         L.openLibs();
  8.         L.LdoFile("hello.lua");
  9.         System.out.println("Hello World from Java!");
  10.     }
  11. }
代码的运行结果当然就是在控制台打印: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这个函数(这就是我前面说的这个项目并“不可靠”的原因...)。我们需要自己添加该函数,仿照其他函数来改吧...

  1. JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
  2.    (JNIEnv * env, jobject jobj, jobject cptr, jint i)
  3. {
  4.     lua_State * L = getStateFromCPtr( env , cptr );
  5.     lua_pushinteger(L, i);
  6. }

  

   这里需要指出的是这个代码并不是我写的,是在网上搜到的,具体是哪位仁兄写的我忘了...请作者见谅哈~

   除了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头文件的版本对应)逐条写入一下两条命令:

  1. D:\luajava-1.1>"E:\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
  2. 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的使用就介绍到这里,不足之处还望见谅~

你可能感兴趣的:(lua)