当前位置: 首页 > article >正文

J2V8学习一 --- 介绍

J2V8是Google流行的JavaScript引擎V8的一组JavaScript绑定。它旨在为Android带来高效的JavaScript,是Tabris.js背后的主力。J2V8还可以在Windows、Linux和MacOS上运行

J2V8在设计时充分考虑了性能和内存消耗。如果JavaScript执行结果为32位整数,则可以直接将其顾问作为原语进行访问,而无需先创建包装器类的实例。64位双精度和布尔值也是如此。

J2V8还使用延迟加载技术。也就是说,只有当访问JavaScript结果时,它才会将其复制到JNI Bridge上。

J2V8只是一组V8的Java绑定,它以Java形式公开V8API。V8是使用C++编写的,要访问V8,J2V8使用JNI.由于本机交互,必须管理C++内存。J2V8可帮助实现这一点,但要求开发人员在不需要对象时通过调用release()明确释放任何本机句柄。释放对象不会将其从JavaScript中释放(V8垃圾收集器会执行此操作);release只是删除本机句柄。释放资源的规则很简单:

1、如果是自己创建的,则必须释放,但有一个例外:如果对象通过返回语句传回,系统将会自动释放
2、如果是系统创建的,则无需担心,但有一个例外:如果该对象作为方法调用的结果返回给自己,则需要释放。

线程模型

JavaScript本身是单线程的,J2V8也强制执行了这一点。对单个运行时的所有访问都必须来自同一个线程。这确保在操作或使用单个JavaScript运行时不会出现竞争条件
虽然J2V8确保对单个运行时的所有访问都必须来自同一线程,但可以创建多个运行时,每个运行时都在自己的线程上。

实例:

访问JavaScript对象

val runtime = V8.createV8Runtime()
runtime.executeVoidScript(
""
    + "var person = {};\n"
    + "var hockeyTeam = {name : 'WolfPack'};\n"
    + "person.first = 'Ian';\n"
    + "person['last'] = 'Bull';\n"
    + "person.hockeyTeam = hockeyTeam;\n"
)
runtime.release()
val person = runtime.getObject("person")
val hockeyTeam = person.getObject("hockeyTeam")
person.release()
hockeyTeam.release()

调用JavaScript函数
 

var hockeyTeam = {
     name      : 'WolfPack',
     players   : [],
     addPlayer : function(player) {
                   this.players.push(player);
                   return this.players.size();
     }
}
V8Array parameters = new V8Array(runtime).push(player1);
int size = hockeyTeam.executeIntegerFunction("addPlayer", parameters);
parameters.release();


http://www.kler.cn/a/387813.html

相关文章:

  • 给查询业务添加redis缓存和缓存更新策略
  • ORA-01092 ORA-14695 ORA-38301
  • jQuery笔记
  • ReactPress:构建高效、灵活、可扩展的开源发布平台
  • Select,poll,epoll和IO多路复用和NIO
  • 【前端】HTML标签汇总
  • 实现uniapp-微信小程序 搜索框+上拉加载+下拉刷新
  • 数学基础 -- 线性代数之线性无关
  • Django的manage.py命令用法
  • Unity 实现一个内存紧凑,高效,兼容度高,支持序列化的Map
  • 【K8S系列】Kubernetes 新创建的 Service 或 Pod 无法被发现问题【已解决】
  • 怎么禁止Ubuntu自动更新升级
  • 使用jmeter查询项目数据库信息,保存至本地txt或excel文件1108
  • Power Pivot、Power BI 和 SQL Server Analysis Services 的公式语言:DAX(数据分析表达式)
  • window11安装elasticsearch+Kibana
  • mac环境配置本地nfs服务
  • Chromium 中chrome.system.cpu扩展接口定义c++
  • 2024年下半年系统分析师论文
  • 【Linux】shell脚本:检测路径是否存在,如不存在则创建
  • Linux设置jar包开机自启
  • 闪耀CeMAT亚洲物流展,驭势科技发布第五代U-Drive®智驾系统
  • 使用docker部署Prometheus和Grafana去监控mysql和redis
  • 喜报!景联文科技成功通过DCMM数据管理能力成熟度二级认证
  • redis和数据库的数据一致性
  • Golang--文件操作
  • D64【python 接口自动化学习】- python基础之数据库