LuaJava:跟着LuaJava一步一步学习JNI -1

本文介绍了如何使用LuaJava创建Lua VM虚拟机,重点解析了LuaState的构造函数和本地方法_open()的实现。在C代码中,通过JNI头文件定义和 LuaState的luaopen_java()方法,展示了CPtr如何在Java与C之间传递以初始化Lua VM。同时,文章通过测试案例比较了直接通过Lua脚本创建Java对象与Java代码创建的性能差异。
摘要由CSDN通过智能技术生成


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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值