Java 测试代码案例1如下:
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
LuaObject global_a = L.getLuaObject("global_a");
使用LuaJava第一步就是创建Lua VM虚拟机LuaState . LuaState 由LuaStateFactory 管理。
LuaState L = LuaStateFactory.newLuaState(); 可以创建一个新LuaState。
但是在LuaState 构造函数中使用_open()本地方法创建LuaVM.
/**
* Constructor to instance a new LuaState and initialize it with LuaJava's functions
* @param stateId
*/
protected LuaState(int stateId)
{
luaState = _open();
luajava_open(luaState, stateId);
this.stateId = stateId;
}
使用的本地方法为:private synchronized native CPtr _open();
在c代码 实现代码为:
************************************************************************/
//由java本地方法生成:LuaState类private synchronized native CPtr _open();
JNIEXPORT jobject JNICALL Java_org_keplerproject_luajava_LuaState__1open(JNIEnv * env , jobject jobj)
{ //通过Lua C API创建LuaVM
lua_State * L = lua_open();
jobject obj;
jclass tempClass;
//通过FindClass()来查找CPtr java类
tempClass = ( *env )->FindClass( env , "org/keplerproject/luajava/CPtr" );
//创建新Java对象
obj = ( *env )->AllocObject( env , tempClass );
if ( obj )
{ //根据类和类字段签名获取类字段
jfieldID _fieldID=( *env )->GetFieldID( env , tempClass , "peer", "J" );
//设置类字段值,这里设置类CPtr 对象obj 字段peer 的值为 L的指针地址。
( *env )->SetLongField( env , obj ,_fieldID , ( jlong ) L );
}
//同时返回CPtr局部对象。
return obj;
}
在JNI.H头文件中:
class _jobject {};
typedef _jobject *jobject;
在__open()返回值为 jobject obj; 其实就是指针的地址。
/**
* An abstraction