Jx9 虚拟机

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 一、Jx9 虚拟机的生命周期


  • 加载 Jx9 脚本 jx9_compile() 或 jx9_compile_file(),加载编译成功后,Jx9 引擎将自动创建一个实例 (jx9_vm) 并且返回指向此虚拟机的指针用于后续调用。
  • 如加载编译 Jx9 脚本时出现问题,也就是编译时出错,可调用jx9_config()方法获取编译错误原因。
  • (可选) jx9_vm_config(),向脚本中传递参数(JX9_VM_CONFIG_ARGV_ENTRY)及注册虚拟机与脚本语言之间数据交互的回调函数(JX9_VM_CONFIG_OUTPUT)。
  • (可选)jx9_create_function() ,用于注册可以从 Jx9 脚本调用的外部函数(通常是 C/C++ 实现的函数)。
  • 执行Jx9 脚本 ,调用 jx9_vm_exec() 执行 Jx9 程序。
  • jx9_vm_extract_variable() 用于提取在 Jx9 脚本中声明的另一个变量的内容。
  • 重置虚拟机 使用 jx9_vm_reset()的虚拟机,然后返回到步骤 5,执行此操作零次或多次。
  • 使用 jx9_vm_release() 销毁虚拟机。
 
二、Jx9 C/C++ API 参考

  Jx9 - 可嵌入的脚本引擎 (symisc.net)
 
三、Jx9 虚拟机编写
  1. //判断Jx9脚本文件是否存在
  2. bool exists_jx9(string strJx9File) {
  3.     struct stat buffer = { 0 };
  4.     return (stat(strJx9File.c_str(), &buffer) == 0);
  5. }
复制代码
  1. //读取Jx9脚本文件
  2. string read_jx9(string strJx9File)
  3. {
  4.     string strRet = _T("");
  5.     size_t sJx9Size = 0;
  6.     std::vector<char> vszBuffer;
  7.     vszBuffer.clear();
  8.     std::shared_ptr<std::iostream> pJx9Script =
  9.         std::make_shared<std::fstream>(strJx9File, std::ios::in | std::ios::binary);
  10.     pJx9Script->seekg(0, ios::end);
  11.     sJx9Size = pJx9Script->tellg();
  12.     pJx9Script->seekg(0);
  13.     if (sJx9Size > 0)
  14.     {
  15.         vszBuffer.resize(sJx9Size);
  16.         pJx9Script->read(&vszBuffer[0], sJx9Size);
  17.         strRet.assign(vszBuffer.begin(), vszBuffer.end());
  18.     }
  19.     return strRet;
  20. }
复制代码
  1. //打印错误日志
  2. void jx9_log(jx9* pEngine, int nResult)
  3. {
  4.     int nLen = 0;
  5.     const char *zErrLog = nullptr;
  6.     if (nResult != JX9_COMPILE_ERR) {
  7.         return;
  8.     }
  9.     /* Extract error log */
  10.     jx9_config(pEngine, JX9_CONFIG_ERR_LOG,
  11.         &zErrLog, &nLen);
  12.     if (nLen > 0) {
  13.         /* zErrLog is null terminated */
  14.         printf(zErrLog);
  15.         printf("\n");
  16.     }
  17. }
复制代码
  1. //回调函数
  2. int Jx9_callback(
  3.     const void *pOutput,
  4.     unsigned int nOutputLen,
  5.     void *pUserData /* Unused */)
  6. {
  7.     return JX9_OK;
  8. }
复制代码
  1. int main(int argc, char** argv)
  2. {
  3.     int nRes = -1;
  4.     string strError = _T("");
  5.     string strJx9File = _T("");
  6.     string strJx9Script = _T("");
  7.     if (argc < 2) {
  8.         printf("参数不够!");
  9.         return 1;
  10.     }
  11.     printf("——————————Jx9 begin——————————\n");
  12.     strJx9File = string(argv[1]);
  13.     jx9* pEngine = nullptr; /* JX9 engine handle*/
  14.     jx9_vm* pVm = nullptr;  /* Compiled JX9 program */
  15.     c_jx9_fun jx9Fun;
  16.     //判断Jx9脚本是否存在
  17.     if (!exists_jx9(strJx9File))
  18.     {
  19.         strError = "Jx9 脚本文件不存在!";
  20.         goto main_end;
  21.     }
  22.     //读取Jx9脚本内容
  23.     strJx9Script = read_jx9(strJx9File);
  24.     if (strJx9Script.empty()) {
  25.         strError = "Jx9 脚本文件为空!";
  26.         goto main_end;
  27.     }
  28.     //初始化引擎
  29.     nRes = jx9_init(&pEngine);
  30.     if (nRes != JX9_OK) {
  31.         strError = "Jx9 引擎初始化失败!";
  32.         goto main_end;
  33.     }
  34.     //编译脚本
  35.     nRes = jx9_compile(pEngine, strJx9Script.c_str(), strJx9Script.length(), &pVm);
  36.     if (nRes != JX9_OK) {
  37.         //
  38.         jx9_log(pEngine, nRes);
  39.         strError = "Jx9 引擎编译脚本失败!";
  40.         goto main_end;
  41.     }
  42.     //注册回调函数
  43.     nRes = jx9_vm_config(pVm,
  44.         JX9_VM_CONFIG_OUTPUT,
  45.         Jx9_callback,        /* Output Consumer callback */
  46.         0                   /* Callback private data */
  47.     );
  48.     if (nRes != JX9_OK) {
  49.         strError = "Jx9 注册回调函数失败!";
  50.         goto main_end;
  51.     }
  52.     //开始执行
  53.     nRes = jx9_vm_exec(pVm, 0);
  54.     if (nRes != JX9_OK) {
  55.         strError = "Jx9 执行失败!";
  56.         goto main_end;
  57.     }
  58.     strError = "Jx9 执行成功!";
  59. main_end:
  60.     //释放
  61.     if (pVm) {
  62.         jx9_vm_release(pVm);
  63.     }
  64.     if (pEngine) {
  65.         jx9_release(pEngine);
  66.     }
  67.     jx9_lib_shutdown();
  68.     printf(strError.c_str());
  69.     return 1;
  70. }<br>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表