j2v8 js调用java_J2V8的使用

本文介绍了J2V8作为Java与V8 JavaScript引擎之间的桥梁,强调了其在性能和内存管理上的优势。详细讨论了手动和自动内存管理,展示了MemoryManager的使用,并探讨了在多线程环境下如何正确使用J2V8,包括锁的获取和释放。此外,还展示了如何在Java中调用和响应JavaScript的函数,以及V8对象与JSON之间的转换方法。
摘要由CSDN通过智能技术生成

js 执行引擎说明

内核演变

Gecko(Netscape) - Trident(IE) - Gecko(firefox Mozilla) - Safari(webkit) - Chrome(Chromium) - Chrome(blink)

javascript引擎 / 什么是J2V8/为什么要使用J2V8

v8 引擎是使用c++编写的,java要使用v8需要通过jni桥接,j2v8 就是起到这样的桥接作用

可用性+性能 => j2v8 > javaScrpitCore

J2v8 相对于 javaScriptCore 性能更优,具体优化了JNI的调用性能问题

J2v8对内存使用上的优化通过暴露api提供释放内存能力

内存管理

1手动管理的部分

j2v8 来说,以下对象必须手动释放:

自行创建的对象。例如 new V8Object() 创建的。

从 js 中主动获取的对象。例如 v8.getObject(xxx).

从 js 数组中提取的。例如 v8Array.getObject(0).

注意:

c++ 层作为参数传入到 java 的对象无需释放。因为它不是 java 自己创建的。

但是若传入的是数组,那么从数组中获取的对象必须释放,因为它是 java 主动获取的。

创建出的用作传给(或返回给) js 的对象必须释放,因为它是 java 创建的。

2 自动管理[MemoryManager]

使用MemoryManager 前

loDash = nodeJS.require(new File("/Users/irbull/node_modules/lodash"));

V8Object o1 = o("a", 1);

V8Object o2 = o("b", 2);

V8Object o3 = o("c", 3);

V8Object objects = (V8Object) loDash.executeJSFunction("assign", o1, o2, o3);

LoDashObject e1 = loDash(objects);

LoDashObject e2 = e1.e("values");

V8Function f = f((V8Object receiver, V8Array parameters) -> parameters.getInteger(0) * 3);

LoDashObject result = e2.e("map",f);

System.out.println(result);

loDash.release();

e1.release();

e2.release();

f.release();

o1.release();

o2.release();

o3.release();

result.release();

objects.release();

使用MemoryManager后

MemoryManager scope = new MemoryManager(v8); // 实例化 MemoryManager

loDash = nodeJS.require(new File("/Users/irbull/node_modules/lodash"));

V8Object objects = (V8Object) loDash.executeJSFunction("assign", o("a", 1), o("b", 2), o("c", 3));

LoDashObject result = loDash(objects).e("values").e("map",

f((V8Object receiver, V8Array parameters) -> parameters.getInteger(0) * 3));

System.out.println(result);

scope.release(); // 释放

多线程

j2v8中使用runtime(v8 createV8Runtime)必须要统一线程使用(提供多线程的能力的同时保障多线程之间信息j2v8相关内容交互)

以下是AsyncTask的使用例子

override fun onPreExecute() {

super.onPreExecute()

if (v8.locker.hasLock()){

v8.locker.release() // 释放主线程的锁

}

}

override fun doInBackground(vararg params: int?): int {

v8.locker.acquire() // 子线程获得锁

// 执行一些 v8 操作

// ...

v8.locker.release() // 释放子线程的锁

return 1

}

override fun onPostExecute(result: int?) {

super.onPostExecute(result)

v8.locker.acquire() // 主线程重新获得锁

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值