2010-10-02 15 views
6

Je crée un falling sand game en Java. Je veux que les utilisateurs puissent écrire leur propre moteur en utilisant un langage plus simple. Les jeux de sable qui tombent peuvent être très gourmands en ressources CPU, je veux donc que le moteur tourne aussi vite que possible sans avoir à compiler manuellement.Comment compiler des fichiers rhino/javascript en .class bytecode pour java à l'exécution

J'ai besoin de savoir comment compiler les fichiers javascript rhino en fichiers .class au moment de l'exécution à utiliser.

J'ai cherché un moyen mais je n'ai pas trouvé autre chose que de le compiler manuellement en utilisant la ligne de commande que je ne veux pas que les utilisateurs doivent faire.

+0

Vous savez donc essentiellement comment le faire? mais vous voulez que cela soit fait dynamiquement et l'utilisateur n'a pas besoin de changer de script rhino pour .class? pour cela, vous pouvez leur fournir un fichier batch qui peut servir votre but ... – Varun

Répondre

4

Il y a un tutoriel ici:

+0

L'exemple de code dans cet article a un petit défaut, C'est l'appel de la fonction 'fib (num);' devrait être derrière la définition de le ça. Merci. –

+0

Cet article indique clairement que rhino ne peut pas compiler .js en .class, bien qu'il puisse le faire. – peterh

1

Vous pouvez compiler vos scripts à exécution à l'aide Context.compileString(). Cela produit un objet Script que vous pouvez réutiliser.

Script s = someContext.compileString(myScript, "<cmd>", 1, null); 

// Store s, cache it in a map or something, maybe even serialize and persist it. 

// Later... 

Object result = s.exec(anotherContext, someScope); 

La différence de performance entre quelque chose comme ça et en utilisant Context.evaluateString() pourrait facilement être plusieurs ordres de grandeur plus rapide.

0

Vous pouvez essayer de l'échantillon suivi:

void toClassFile(String script) throws IOException { 
    CompilerEnvirons compilerEnv = new CompilerEnvirons(); 
    ClassCompiler compiler = new ClassCompiler(compilerEnv); 
    Object[] compiled = compiler.compileToClassFiles(script, null, 1, "javascript.Test"); 
    for(int j = 0; j != compiled.length; j += 2) { 
     String className = (String)compiled[j]; 
     byte[] bytes = (byte[])compiled[(j + 1)]; 
     File file = new File(className.replace('.', '/') + ".class"); 
     file.getParentFile().mkdirs(); 
     try (FileOutputStream fos = new FileOutputStream(file)) { 
      fos.write(bytes); 
     } 
    } 
}