一、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. [FAQ] Pytorch PytorchStreamReader failed reading zip archive

    比如:rm -rf ~/.cache/huggingface Tool:ChatAI Link:https://www.cnblogs.com/farwish/p/17290240.html

  2. openpyxl模块操作Excel

    1.openpyxl模块了解 1.excel版本问题 03版本之前的excel文件后缀名xls 03版本之后的excel文件后缀名xlsx 2.python操作excel表格的模块 openpyxl ...

  3. Go语言基础(一)

    一.Go语言简介 Go即Golang,是Google公司2009年11月正式对外公开的一门语言 Go是静态强类型语言,是区别于解析型语言的编译型语言. 解析型语言--源代码是先翻译为中间代码,然后解析 ...

  4. Solution Set - 数论相关

    绝了,六道题都差一步想出来或者差一个细节就开始看题解. CF906D Link&Submission. 要求 \(a^b\bmod p\),那就要求 \(b\bmod \varphi(p)\) ...

  5. AI实战 | 手把手带你打造智能待办助手

    背景 大家好,我是努力的小雨.今天我想分享一下搭建待办助手的经历.起初,我并没有什么特别的创意点子.但在4月16日的百度Create大会上,我看到了小度的大模型加持使得其变得更加智能.我被一场示例所震 ...

  6. 03.redis 事务

    课程学习地址: https://www.bilibili.com/video/BV1S54y1R7SB?p=23 中间手册地址: http://www.redis.cn/ Redis事务本质:一组命令 ...

  7. uniapp获取用户信息

    新接口getUserProfileFn内置login,如果必须要login返回的参数要隔离开 vue3书写要对按钮配置属性 <button @click="logintou" ...

  8. 删除字符串A中与字符串B相同的字符

    /** * file name:DelDestChar.c * author : liaojx2016@126.com * date : 2024-05-06 * function : Delete ...

  9. 谈谈 Spring 的过滤器和拦截器

    前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况.那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景. ( ...

  10. apisix~自定义插件的部署

    参考 https://docs.api7.ai/apisix/how-to-guide/custom-plugins/create-plugin-in-lua https://apisix.apach ...