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

  Jx9 - 可嵌入的脚本引擎 (symisc.net)

三、Jx9 虚拟机编写
//判断Jx9脚本文件是否存在
bool exists_jx9(string strJx9File) {
struct stat buffer = { 0 };
return (stat(strJx9File.c_str(), &buffer) == 0);
}
//读取Jx9脚本文件
string read_jx9(string strJx9File)
{
string strRet = _T("");
size_t sJx9Size = 0;
std::vector<char> vszBuffer;
vszBuffer.clear(); std::shared_ptr<std::iostream> pJx9Script =
std::make_shared<std::fstream>(strJx9File, std::ios::in | std::ios::binary);
pJx9Script->seekg(0, ios::end);
sJx9Size = pJx9Script->tellg();
pJx9Script->seekg(0);
if (sJx9Size > 0)
{
vszBuffer.resize(sJx9Size);
pJx9Script->read(&vszBuffer[0], sJx9Size);
strRet.assign(vszBuffer.begin(), vszBuffer.end());
}
return strRet;
}
//打印错误日志
void jx9_log(jx9* pEngine, int nResult)
{
int nLen = 0;
const char *zErrLog = nullptr;
if (nResult != JX9_COMPILE_ERR) {
return;
}
/* Extract error log */
jx9_config(pEngine, JX9_CONFIG_ERR_LOG,
&zErrLog, &nLen);
if (nLen > 0) {
/* zErrLog is null terminated */
printf(zErrLog);
printf("\n");
}
}
//回调函数
int Jx9_callback(
const void *pOutput,
unsigned int nOutputLen,
void *pUserData /* Unused */)
{
return JX9_OK;
}
int main(int argc, char** argv)
{
int nRes = -1;
string strError = _T("");
string strJx9File = _T("");
string strJx9Script = _T("");
if (argc < 2) {
printf("参数不够!");
return 1;
} printf("——————————Jx9 begin——————————\n");
strJx9File = string(argv[1]); jx9* pEngine = nullptr; /* JX9 engine handle*/
jx9_vm* pVm = nullptr; /* Compiled JX9 program */
c_jx9_fun jx9Fun; //判断Jx9脚本是否存在
if (!exists_jx9(strJx9File))
{
strError = "Jx9 脚本文件不存在!";
goto main_end;
} //读取Jx9脚本内容
strJx9Script = read_jx9(strJx9File);
if (strJx9Script.empty()) {
strError = "Jx9 脚本文件为空!";
goto main_end;
} //初始化引擎
nRes = jx9_init(&pEngine);
if (nRes != JX9_OK) {
strError = "Jx9 引擎初始化失败!";
goto main_end;
} //编译脚本
nRes = jx9_compile(pEngine, strJx9Script.c_str(), strJx9Script.length(), &pVm);
if (nRes != JX9_OK) {
//
jx9_log(pEngine, nRes);
strError = "Jx9 引擎编译脚本失败!";
goto main_end;
} //注册回调函数
nRes = jx9_vm_config(pVm,
JX9_VM_CONFIG_OUTPUT,
Jx9_callback, /* Output Consumer callback */
0 /* Callback private data */
);
if (nRes != JX9_OK) {
strError = "Jx9 注册回调函数失败!";
goto main_end;
} //开始执行
nRes = jx9_vm_exec(pVm, 0);
if (nRes != JX9_OK) {
strError = "Jx9 执行失败!";
goto main_end;
}
strError = "Jx9 执行成功!";
main_end:
//释放
if (pVm) {
jx9_vm_release(pVm);
}
if (pEngine) {
jx9_release(pEngine);
}
jx9_lib_shutdown(); printf(strError.c_str());
return 1;
}

Jx9 虚拟机的更多相关文章

  1. 基于本地存储的kvm虚拟机在线迁移

    基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...

  2. Linux虚拟机的安装(使用Centos6.3)

    1.什么是虚拟机? 虚拟机指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 2.安装Linux虚拟机前要做的准备 2.1:一台windows环境的pc 2.2:下载VM ...

  3. 在Linux虚拟机下配置tomcat

    1.到Apache官网下载tomcat http://tomcat.apache.org/download-80.cgi 博主我下载的是tomcat8 博主的jdk是1.8 如果你们的jdk是1.7或 ...

  4. Hyper-V3:虚拟机的配置

    在Hyper-V成功新建一台虚拟机,在正式使用之前,必须配置VM使用的硬件资源,并授予用户访问VM的权限等,本文罗列出一些常见的配置,供读者参阅. 一,为虚拟机分配使用的内存 在Hyper-V Man ...

  5. Hyper-v 安装CentOS 7 (其他虚拟机一样参考)

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html hyper-v安装很多人没弄过,我这里介绍一下.(其他虚拟机参 ...

  6. virtualbox linux虚拟机相关

    linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...

  7. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  8. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  9. 使用SecureCRT连接虚拟机(ubuntu)配置记录

    这种配置方法,可以非常方便的操作虚拟机里的Linux系统,且让VMware在后台运行,因为有时候我直接在虚拟机里操作会稍微卡顿,或者切换速度不理想,使用该方法亲测本机效果确实ok,特此记录. Secu ...

  10. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

随机推荐

  1. 优秀的 RocketMQ 可视化管理工具 GUI 客户端

    优秀的 RocketMQ 可视化管理工具 GUI 客户端 官网地址:http://www.redisant.cn/rocketmq 快速查看所有 RocketMQ 集群,包括Brokers.Topic ...

  2. 【人脸识别】OpenCV获取自己的图像

    思路:先获取10000张自己的图像,然后通过CNN神经网络进行学习. 第一步:先获取自己的脸的数据.如何做? 代码如下: import cv2 import os import sys import ...

  3. Dash 2.17版本新特性介绍

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,不久前Dash发布了其2.17.0版本,执行下面的命令进行最 ...

  4. 【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测

    YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接.该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的 ...

  5. Typora最后的免费版本0.11.18

    Typora最后的免费版本为0.11.18. 之后的1.x开始收费. 免费版本0.11.18的百度网盘链接如下(永久链接): 链接:https://pan.baidu.com/s/1XizAD0SFp ...

  6. ansible系列(25)--ansible的notify和handlers

    1. notify和handlers Handlers 是一个触发器,同时是一个特殊的 tasks ,它无法直接运行,它需要被tasks 通知后才会运行.比如: httpd 服务配置文件发生变更,我们 ...

  7. ubuntu配置nginx+php开发环境(virtualbox)

    A.安装环境 1.安装php7.0 sudo apt install php7.0 2.安装php7.0-fpm,这是php和nginx之间的连接器. sudo apt install php7.0- ...

  8. 暴力破解(Pikachu)

    暴力破解(Pikachu靶场) Burpsuite4种攻击类型 Sinper(狙击手): 可以理解为一个一个爆破,也就是字典只能设置一个,然后用字典替换选择的参数,爆破完一个参数后再爆破另一个参数. ...

  9. Js中valueOf和toString区别和使用

    对于number.string.Boolean.object.symbol数据类型调用valueOf方法,得到的都是数据本身(null.undefined两种类型上的原型链上没有valueOf方法) ...

  10. HEOI 2024游记

    (虽然是体验罢 HEOI2024游记 前 \(\,\,\)省选! \(\,\,\)得知省选可以报名体验的时候着实很兴奋 也是不假思索的就报了 Day 0 本来说是九点上大巴 结果硬生拖到十点半(恼 分 ...