Jx9 虚拟机
一、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 虚拟机编写
//判断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 虚拟机的更多相关文章
- 基于本地存储的kvm虚拟机在线迁移
基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...
- Linux虚拟机的安装(使用Centos6.3)
1.什么是虚拟机? 虚拟机指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 2.安装Linux虚拟机前要做的准备 2.1:一台windows环境的pc 2.2:下载VM ...
- 在Linux虚拟机下配置tomcat
1.到Apache官网下载tomcat http://tomcat.apache.org/download-80.cgi 博主我下载的是tomcat8 博主的jdk是1.8 如果你们的jdk是1.7或 ...
- Hyper-V3:虚拟机的配置
在Hyper-V成功新建一台虚拟机,在正式使用之前,必须配置VM使用的硬件资源,并授予用户访问VM的权限等,本文罗列出一些常见的配置,供读者参阅. 一,为虚拟机分配使用的内存 在Hyper-V Man ...
- Hyper-v 安装CentOS 7 (其他虚拟机一样参考)
平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html hyper-v安装很多人没弄过,我这里介绍一下.(其他虚拟机参 ...
- virtualbox linux虚拟机相关
linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)
Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...
- 使用SecureCRT连接虚拟机(ubuntu)配置记录
这种配置方法,可以非常方便的操作虚拟机里的Linux系统,且让VMware在后台运行,因为有时候我直接在虚拟机里操作会稍微卡顿,或者切换速度不理想,使用该方法亲测本机效果确实ok,特此记录. Secu ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
随机推荐
- dotnet 统信 UOS 运行 UNO FrameBuffer 应用错误 Failed to open FrameBuffer device
本文记录在 UOS 统信系统上运行 UNO 的基于 Skia 的 FrameBuffer 应用报错问题,错误提示是 Unhandled exception. System.InvalidOperati ...
- WPF 已知问题 清空 CollectionView 的 SortDescriptions 可能抛出空异常
本文记录一个 WPF 的已知问题,在通过 CollectionViewSource 获取到 CollectionView 之后,如果 CollectionViewSource 对象已被 GC 回收,将 ...
- 开发日志:企业微信实现扫码登录(WEB)
一:获取扫码登陆所需的参数:appid,secret,agentid 登录企业微信:https://work.weixin.qq.com/ 扫码登录文档:https://work.weixin.qq. ...
- 用Multisim验证简易测谎仪
用Multisim验证简易测谎仪 测谎仪电路如下图所示: 节点1,2之间用10M欧的电位计代表人体表电阻,原理是撒谎出汗的话,体表电阻就小.Q1,Q2构成互补音频振荡器,振荡频率由R2.C1和R12共 ...
- cesium教程1-加载显示地图
1.完整示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- grads读取netcdf文件,报错SDF file has no discernable X coordinate解决办法
1.netcdf文件格式说明 netCDF数据格式在气象中有广泛的应用,这种格式有一定的复杂性.作为数据的使用者可以不用对数据格式了解得很详细,不过大致的了解还是有必要的.netCDF是自描述的二进制 ...
- Vue-Plugin-HiPrint
Vue-Plugin-HiPrint 是一个Vue.js的插件,旨在提供一个简单而强大的打印解决方案.通过 Vue-Plugin-HiPrint,您可以轻松地在Vue.js应用程序中实现高度定制的打印 ...
- ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。
Promise.withResolvers 使用 Promise.withResolvers() 关键的区别在于解决和拒绝函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性 ...
- 远程桌面使用Pr剪视频
要远程访问高性能计算机并使用 Pr(Adobe Premiere Pro)进行视频编辑,您可以考虑使用流畅且响应迅速的远程桌面软件.您可以考虑以下选项. Splashtop Business Acce ...
- Advanced .Net Debugging 8:线程同步
一.介绍 这是我的<Advanced .Net Debugging>这个系列的第八篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第六章[同步].我们经常写一些多线程的应用程序,写的 ...