通过调试LuaJava源文件来学习和了解LuaJava. LuaJava 作为Java的脚本工具,核心代码通过luajava.c文件来实现,luajava是通过jni 技术实现的. 一步一步调试LuaJava源代码同时有助于学习JNI技术.
1 -hello.a lua文件 内容:global_a ="global_a_string"
Lua源文件,文件中仅仅包含一个Lua全局变量,该全局变量为字符串类型.global_a ="global_a_string"
2-TestLuaJava java文件
//加载Lua 虚拟机
LuaState L = LuaStateFactory.newLuaState();
//加载Lua 自身类库
L.openLibs();
//加载hello.lua 模块
L.LdoFile("hello.lua");
//获取 global_a 全局变量
LuaObject global_a = L.getLuaObject("global_a");
if(global_a.isString()){
System.out.println("global_a:"+global_a);
} L.close(); //最后要关闭Lua VM 来释放资源
3- 一步一步调试LuaJava源代码
通过stateid来创建LuaState虚拟机, _open() 函数为JNI c语言实现的函数,用来获取c语言中虚拟机指针. private CPtr luaState; luaState私有成员是在Java中对C指针的一个抽象.
在LuaState类中,_open()函数原型如下:
private synchronized native CPtr _open();
在luajava.c中 代码如上,对应c和java语言交换的API 不熟悉,暂时放置在这里.
在创建LuaState时,注册java中的几个关键类来供Lua来使用.
/**************************** JNI FUNCTIONS ****************************/
/************************************************************************
* JNI Called function
* LuaJava API Function
************************************************************************/
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState_luajava_1open
( JNIEnv * env , jobject jobj , jobject cptr , jint stateId )
{
lua_State* L;
jclass tempClass;
/