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();