一、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. Spark 大数据处理最佳实践

    开源大数据社区 & 阿里云 EMR 系列直播 第十一期 主题:Spark 大数据处理最佳实践 讲师:简锋,阿里云 EMR 数据开发平台 负责人 内容框架: 大数据概览 如何摆脱技术小白 Spa ...

  2. WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等

    在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等.这是多 ...

  3. dotnet 5 的 bin 文件夹下的 ref 文件夹是做什么用的

    本文来和大家聊聊在 dotnet 5 和 dotnet 6 或更高版本的 dotnet 构建完成,在 bin 文件夹下,输出的 ref 文件夹.在此文件夹里面,将会包含项目程序集同名的 dll 文件, ...

  4. Raft 共识算法4-选举限制

    Raft 共识算法4-选举限制 Raft算法中译版地址:https://object.redisant.com/doc/raft中译版-2023年4月23日.pdf 英原论文地址:https://ra ...

  5. 兼容ie8问题

    <!-- 让IE8/9支持媒体查询,从而兼容栅格 --><!--[if lt IE 9]><script src="https://cdn.staticfile ...

  6. 探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义

    DTD 是文档类型定义(Document Type Definition)的缩写.DTD 定义了 XML 文档的结构以及合法的元素和属性. 为什么使用 DTD 通过使用 DTD,独立的团体可以就数据交 ...

  7. 🔥 PyTorch神操作:一图秒懂Tensor变形记!

    亲爱的码农小伙伴们,你们是否还在为Tensor的各种变换头大如斗?别怕,今天给大家送上一张超实用的PyTorch变换秘籍图,让你的Tensor操作如行云流水,CPU和GPU之间的切换如穿梭自如! GP ...

  8. 大模型_2.2:Prompt示例

    1.行业洞察分析 行业洞察分析的方法论:使用麦肯锡工作法可以快速了解一个行业. Step1:通过搜索分析几十个与该行业相关的关键词,覆盖该行业的上下游,以获取全面的信息. Step2:阅读一些行业最新 ...

  9. nvm环境安装

    目录 nvm是什么 使用背景 nvm的坑. nvm,node,npm之间的区别. nvm.nodejs.npm的关系: nvm-windows下载地址 安装 linux . mac 源码包下载地址 解 ...

  10. 【Vue】vuex存储和本地存储(localstorage、sessionstorage)的区别

    sessionStorage sessionStorage 方法针对一个 session 进行数据存储.当用户关闭浏览器窗口后,数据会被删除. 用法: 储存: 1. 点(.)运算符 sessionSt ...