如何让Rhino运行自定义javascript setTimeout函数,无休止的评估
我发现gameboy脚本是用javascript编写的,我正试图让它用java运行。 (我不寻找任何java gameboy模拟器) 我有一个包含这两个文件的javascript如何让Rhino运行自定义javascript setTimeout函数,无休止的评估,java,javascript,timer,settimeout,rhino,Java,Javascript,Timer,Settimeout,Rhino,我发现gameboy脚本是用javascript编写的,我正试图让它用java运行。 (我不寻找任何java gameboy模拟器) 我有一个包含这两个文件的javascript function cout(e, t) { java.lang.System.out.println("e = " + e + " t = " + t); } function setTimeout(expr, msec) { if (typeof expr == "function") {
function cout(e, t) {
java.lang.System.out.println("e = " + e + " t = " + t);
}
function setTimeout(expr, msec) {
if (typeof expr == "function") {
// save the global object and trailing args for later apply
var gobj = this;
var args = [].concat(arguments).slice(2);
var o = {actionPerformed: function(){expr.apply(gobj, args)}};
} else {
var o = {actionPerformed: function(){eval(expr)}};
}
var al = new java.awt.event.ActionListener(o);
var t = new javax.swing.Timer(msec, al);
t.start();
}
我在另一个javascript文件中有类似的内容
var frames = 0;
function tick() {
var a = (new Date().getTime() - tstart) - ttime;
while (a > settings[6]) {
ttime += settings[6];
a = (new Date().getTime() - tstart) - ttime;
gameboy.run()
frames++;
}
setTimeout(tick, settings[6])
}
下面是我的JavaRhino代码修改过的例子之一
public class GameBoyJS {
/**
* Main entry point.
*
* Process arguments as would a normal Java program. Also
* create a new Context and associate it with the current thread.
* Then set up the execution environment and begin to
* execute scripts.
*/
public GameBoyJS()
{
Context context = Context.enter();
try {
Scriptable globalScope = context.initStandardObjects();
Reader base64LibReader = new InputStreamReader(getClass().getResourceAsStream("js/base64.js"));
//Reader msgpackLibReader = new InputStreamReader(getClass().getResourceAsStream("js/msgpack.js"));
Reader json2LibReader = new InputStreamReader(getClass().getResourceAsStream("js/json2.js"));
Reader terminalLibReader = new InputStreamReader(getClass().getResourceAsStream("js/terminal.js"));
//Reader resizeLibReader = new InputStreamReader(getClass().getResourceAsStream("js/resize.js"));
Reader GameBoyIOLibReader = new InputStreamReader(getClass().getResourceAsStream("js/GameBoyIO.js"));
Reader GameBoyCoreLibReader = new InputStreamReader(getClass().getResourceAsStream("js/GameBoyCore.js"));
//Reader XAudioServerLibReader = new InputStreamReader(getClass().getResourceAsStream("js/XAudioServer.js"));
//Replace this with your current gameboy rom file.
Reader RomLibReader = new InputStreamReader(getClass().getResourceAsStream("js/roms/crystal.js"));
//Put the files into javascript engine.
context.evaluateReader(globalScope, base64LibReader, "base64.js", 1, null);
//context.evaluateReader(globalScope, msgpackLibReader, "msgpack.js", 1, null);
context.evaluateReader(globalScope, json2LibReader, "json2.js", 1, null);
context.evaluateReader(globalScope, terminalLibReader, "terminal.js", 1, null);
//context.evaluateReader(globalScope, resizeLibReader, "resize.js", 1, null);
context.evaluateReader(globalScope, GameBoyIOLibReader, "GameBoyIO.js", 1, null);
context.evaluateReader(globalScope, GameBoyCoreLibReader, "GameBoyCore.js", 1, null);
//context.evaluateReader(globalScope, XAudioServerLibReader, "XAudioServer.js", 1, null);
context.evaluateReader(globalScope, RomLibReader, "crystal.js", 1, null);
// Add a global variable out that is a JavaScript reflection of the System.out variable:
Object wrappedOut = Context.javaToJS(System.out, globalScope);
ScriptableObject.putProperty(globalScope, "out", wrappedOut);
String code = "cout('Gameboy frame finished' + frames);";
context.evaluateString(globalScope, code, "<mem>", 1, null);
// Tried a hack here (this below is stupid but just to prove my suspensions)
for(int i = 0;i <=50; i++) {
context.evaluateString(globalScope, code, "<mem>", 1, null);
System.out.println("okay next frame");
}
} catch(IOException ioe) {
ioe.printStackTrace();
} finally {
Context.exit();
}
}
}
public class GameBoyJS{
/**
*主要入口点。
*
*像处理普通Java程序一样处理参数
*创建新上下文并将其与当前线程关联。
*然后设置执行环境并开始
*执行脚本。
*/
公共游戏
{
Context=Context.enter();
试一试{
可编写脚本的globalScope=context.initStandardObjects();
Reader base64LibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/base64.js”);
//Reader msgpackLibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/msgpack.js”);
Reader json2LibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/json2.js”);
Reader terminalLibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/terminal.js”);
//Reader resizeLibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/resize.js”);
Reader GameBoyIOLibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/GameBoyIO.js”);
Reader GameBoyCoreLibReader=新的InputStreamReader(getClass().getResourceAsStream(“js/GameBoyCore.js”);
//Reader XAudioServer libreader=新的InputStreamReader(getClass().getResourceAsStream(“js/XAudioServer.js”);
//将其替换为当前的gameboy rom文件。
Reader-RomLibReader=newInputStreamReader(getClass().getResourceAsStream(“js/roms/crystal.js”);
//将文件放入javascript引擎。
evaluateReader(globalScope,base64LibReader,“base64.js”,1,null);
//evaluateReader(globalScope,msgpackLibReader,“msgpack.js”,1,null);
evaluateReader(globalScope,json2LibReader,“json2.js”,1,null);
evaluateReader(globalScope,terminalLibReader,“terminal.js”,1,null);
//evaluateReader(globalScope,resizeLibReader,“resize.js”,1,null);
evaluateReader(globalScope,GameBoyIOLibReader,“GameBoyIO.js”,1,空);
evaluateReader(globalScope,GameBoyCoreLibReader,“GameBoyCore.js”,1,空);
//evaluateReader(globalScope,XAudioServerLibReader,“XAudioServer.js”,1,null);
evaluateReader(globalScope,RomLibReader,“crystal.js”,1,null);
//添加全局变量out,该变量是System.out变量的JavaScript反映:
Object wrappedOut=Context.javaToJS(System.out,globalScope);
ScriptableObject.putProperty(globalScope,“out”,wrappedOut);
String code=“cout('Gameboy frame finished'+frames);”;
evaluateString(globalScope,代码,“”,1,null);
//在这里尝试了一次黑客攻击(下面这是愚蠢的,但只是为了证明我的暂停)
对于(inti=0;i找到的解决方案,只需在运行rhino之前将其放入任何Java脚本中即可
还有一个JavaAdapter无法找到的bug请确保在修复该bug的地方使用Rhino 1.7R5
只需谷歌搜索rhino-1.7R5-SNAPSHOT.jar
(function(global) {
var timer = new java.util.Timer();
var counter = 1;
var ids = {};
global.setTimeout = function(fn, delay) {
var id = counter;
counter += 1;
ids[id] = new JavaAdapter(java.util.TimerTask, { run : fn });
timer.schedule(ids[id], delay);
return id;
};
global.clearTimeout = function(id) {
ids[id].cancel();
timer.purge();
delete ids[id];
};
global.setInterval = function(fn, delay) {
var id = counter;
counter += 1;
ids[id] = new JavaAdapter(java.util.TimerTask, { run : fn });
timer.schedule(ids[id], delay, delay);
return id;
};
global.clearInterval = global.clearTimeout;
// exports object in case of "isCommonJS"
global.exports = {};
})(this);
找到的解决方案只是在运行rhino之前将其放入任何Java脚本中
还有一个JavaAdapter无法找到的bug请确保在修复该bug的地方使用Rhino 1.7R5
只需谷歌搜索rhino-1.7R5-SNAPSHOT.jar
(function(global) {
var timer = new java.util.Timer();
var counter = 1;
var ids = {};
global.setTimeout = function(fn, delay) {
var id = counter;
counter += 1;
ids[id] = new JavaAdapter(java.util.TimerTask, { run : fn });
timer.schedule(ids[id], delay);
return id;
};
global.clearTimeout = function(id) {
ids[id].cancel();
timer.purge();
delete ids[id];
};
global.setInterval = function(fn, delay) {
var id = counter;
counter += 1;
ids[id] = new JavaAdapter(java.util.TimerTask, { run : fn });
timer.schedule(ids[id], delay, delay);
return id;
};
global.clearInterval = global.clearTimeout;
// exports object in case of "isCommonJS"
global.exports = {};
})(this);
我有一个异常java.lang.UnsupportedOperationException:无法在android上的rhino1.7.12上加载这种类型的类文件
。我已经设置了rhinoContext.optimizationLevel=-1;
。奇怪。遵循和。现在它在android上工作。我有一个异常java.lang.UnsupportedOperationException:无法加载这种类型的类f在android上的rhino1.7.12上安装ile
。我已经设置了rhinoContext.optimizationLevel=-1;
。奇怪。遵循和。现在它可以在android上运行。