2013-03-27 10 views
7

ユーザーからJavaコードの行を取得し、Androidで実行したいと考えています。例:Androidで実行時にJavaコード文字列を実行することは可能ですか?

String strExecutable = " int var; var = 4 + 3" 
Object obj = aLibrary.eval(strExecutable); 

これはJavaスクリプトではなく、Javaコードを実行します。

可能ですか?はいの場合はどうですか?

私はthisのようなリンクを研究しました。しかし、Android DalvikではなくJVMに関する質問です。

+1

AndroidはOSです。 Javaを使ってAndroid用のアプリケーションを作成する – Blackbelt

+0

@blackbelt Androidとは、通常Dalvikとそのライブラリを意味します。 – breceivemail

+1

私は任意のJavaコードについてはわかりませんが、[この質問](http://stackoverflow.com/questions/2226863/構文解析のためのライブラリ - for-java)と[this one](http://stackoverflow.com/questions/13747069/is-there-a-mathematical-expression-parsing-ライブラリオンアンドロイド)は、要件が単純な数学であれば、類似しているように見えます。 [MVEL](http://mvel.codehaus.org)はあなたのサンプル文字列を処理する必要があります。 – ig0774

答えて

1

あなたはこのような何かを試すことができます。

// Code Execute, Khaled A Khunaifer, 27 March 2013 
class CodeExcute 
{ 
    public static void execute (String[] commands, String[] headers) 
    { 
     // build commands into new java file 
     try 
     { 
      FileWriter fstream = new FileWriter("Example.java"); 
      BufferedWriter out = new BufferedWriter(fstream); 

      out.write(""); 

      for (String header : headers) out.append(header); 

      out.append("class Example { public static void main(String args[]) { "); 

      for (String cmd : commands) out.append(cmd); 

      out.append(" } }"); 

      out.close(); 
     } 
     catch (Exception e) 
     { 
      System.err.println("Error: " + e.getMessage()); 
     } 

     // set path, compile, & run 
     try 
     { 
      Process tr = Runtime.getRuntime().exec(
       new String[]{ "java -cp .", 
        "javac Example.java", 
        "java Example" }); 
     } 
     catch (Exception e) 
     { 
      System.err.println("Error: " + e.getMessage()); 
     } 

    } 
} 
2

あなたがBeanShellを試すことができます!それは超簡単で、アンドロイドでも動作します。 jarライブラリでアプリケーションをビルドするだけです。

import bsh.Interpreter; 
private void runString(String code){  
    Interpreter interpreter = new Interpreter(); 
    try { 
     interpreter.set("context", this);//set any variable, you can refer to it directly from string 
     interpreter.eval(code);//execute code 
    } 
    catch (Exception e){//handle exception 
     e.printStackTrace(); 
    } 
} 

しかし、注意してください!プロダクションアプリでこれを使用するとセキュリティリスクが発生する可能性があります(特に、アプリがユーザーのデータ/ファイルとやりとりする場合)

関連する問題