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虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
随机推荐
- WPF 由于系统颜色配置 Mscms 组件损坏启动失败
本文记录 WPF 应用程序,因为系统的颜色配置 Mscms.dll 组件损坏导致应用加载图片失败,从而启动失败的原因和解决方法 在 WPF 应用加载图片时,将会调用到系统的 Mscms.dll 组件. ...
- netcore依赖注入通过反射简化
aspnetcore里面用到许多的service,好多业务代码都要通过Service.AddScoped.Singleton.Transient等注入进去,类太多了写起来和管理起来都很麻烦,所以借鉴了 ...
- C语言程序设计-笔记6-数组
C语言程序设计-笔记6-数组 例7-1 输出所有大于平均值的数.输入n个整数(1 ),计算这些数的平均值,再输出所有大于平均值的数. #include<stdio.h> int main ...
- axios的基本
目录 axios基本使用.html axios+vue.html axios基本使用.html <!DOCTYPE html> <html lang="en"&g ...
- go实现发送邮件验证码
目录 开启SMTP服务: 发邮件测试 业务实现 开启SMTP服务: QQ邮箱参考下面连接: QQ邮箱如何开通SMTP服务 https://jingyan.baidu.com/article/00a07 ...
- 在jeecg-boot中密码的使用
1.生成密码并入库保存 String id= SnowflakeIdUtil.nextValue();//生成id operatCompany.setId(id); String salt = oCo ...
- 小程序真机报错errMsg: “hideLoading:fail:toast can‘t be found“ ?
showLoading 和 showToast 同时只能显示一个: showLoading 应与hideLoading 配对使用: 把请求接口统一封装,开始请求接口时showLoading,请求接口后 ...
- 网络安全—模拟ARP欺骗
文章目录 网络拓扑 安装 使用 编辑数据包 客户机 攻击机 验证 仅做实验用途,禁止做违法犯罪的事情,后果自负.当然现在的计算机多无法被欺骗了,开了防火墙ARP欺骗根本无效. 网络拓扑 均使用Wind ...
- (图形界面)Dbever连接MySQL8 报错mysql8 安装The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
问题原因是没有设置时区,这个在Mysql8中会有 解决方式: 在这个位置加上UTC时区就可以了. IDEA添加方式 设置Advanced的allowPublicKeyRetrieval为true 同时 ...
- Pageoffice6 实现后台生成单个PDF文档
在实际项目中经常遇到这样的场景,客户希望后台动态生成PDF文档,目前网上有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案对比". Pa ...