2013-03-27 22 views
7

Chcę uzyskać linię kodu Java od użytkownika i wykonać ją w systemie Android. Na przykład:Czy można uruchomić łańcuch kodu Java w środowisku wykonawczym w systemie Android?

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

Nie jest to skrypt Java i chcę uruchomić kod Java.

Czy to możliwe? Jeśli tak, to w jaki sposób?

Badałem linki takie jak this. Ale są to pytania dotyczące JVM, a nie Androida Dalvik.

+1

Android to system operacyjny. Tworzysz aplikacje dla systemu Android, używając JAVA – Blackbelt

+0

@blackbelt Kiedy mówimy o Androidzie, zwykle mamy na myśli Dalvik i jego biblioteki – breceivemail

+1

Nie jestem pewien co do arbitralnego kodu Java, ale [to pytanie] (http://stackoverflow.com/questions/2226863/ whats-a-good-library-for-parsing-mathematical-expressions-in-java) i [this one] (http://stackoverflow.com/questions/13747069/is-there-a-mathematical-expression-parsing- biblioteka na Androida) wydają się podobne, jeśli wymagania są tylko prostą matematyką. [MVEL] (http://mvel.codehaus.org) powinien obsługiwać twój przykładowy ciąg znaków. – ig0774

Odpowiedz

1

Można spróbować czegoś takiego:

// 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

Można spróbować BeanShell! To bardzo proste i działa również na Androida. Po prostu zbuduj swoją aplikację z biblioteką słoików.

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

Ale uważaj! Używanie tego w aplikacji produkcyjnej może być zagrożeniem bezpieczeństwa, szczególnie jeśli twoja aplikacja wchodzi w interakcje z danymi/plikami użytkowników.