2012-05-29 77 views
0

我目前有一個編譯好的jar文件,我想在android設備上使用。代碼使用System.out.println()輸出到命令行。Android設備上的命令行Jar

我該如何創建一個包裝來抓取標準輸出並將其放在android設備的文本視圖中?我是否需要對jar進行任何更改(我擁有所有源代碼)以允許封裝?

在此先感謝。

回答

0

我想你需要做一些改變。你可以通過調用

System.setOut(PrintStream out) 
// Reassigns the "standard" output stream. 

哪裏out是你自己的類,將打印數據以文本視圖設置非標準輸出。請參閱swing solution。只需設置附加到文本視圖,您可以使用此代碼。

或者只是創建一個方法

void log(String message); 

在這裏你添加文本視圖。然後將所有println()調用更改爲此。

0

首先你應該考慮Android有一個叫做Dalvik的特定Java虛擬機,而不是任何jar都可以在它下面運行。

  • 如果在你的罐子,其中輸出發生時,最好的辦法是創建具有TextView通常應用的一個點,包括你的罐子它的構建路徑,並輸出到它代替調用println()

    public void print(String msg) { 
        mTextView.setText(msg); 
    } 
    
  • 如果是輸出的許多來源,你可以運行你罐子使用java.lang.Process和使用它的getInputStream()方法來讀取打印的信息:

    public static final String XBOOT_CLASS_PATH = "-Xbootclasspath:/system/framework/core.jar" 
    public static final String CLASS_PATH = "-classpath /path/to/your/file.jar com.your.package.name" 
    ... 
    Process p = new ProcessBuilder("dalvikvm", XBOOT_CLASS_PATH, CLASS_PATH).start(); 
    BufferedReader reader = new BufferedReader (new InputStreamReader(p.getInputStream())); 
    String msg = reader.readLine(); 
    if (msg != null) { 
        mTextView.setText(msg); 
    } 
    // Cleanup omitted for simplicity 
    
+0

事實上@alaster解決方案更加優雅 –

0

如果它在這裏一個可執行的JAR文件是一個工作示例

這種簡單的可執行的HelloWorld jar file添加到您的Android項目的構建路徑

如果JAR文件沒有一個包,那麼你,將不得不使用Reflection來調用it.Other方法明智的你可以導入類文件,並直接調用的主要方法(這個例子罐子有一個包「PSAE」)

如:

TextView tv = (TextView)findViewById(R.id.textv); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PrintStream ps = new PrintStream(baos); 
System.setOut(ps); 
String[] params = {"Aneesh","Joseph"}; 
psae.HelloWorld.main(params); 
String output = baos.toString(); 
tv.setText(output) 

如果jar文件只有一個默認包,那麼您將無法從該jar中導入類文件,因此您將不得不使用Reflection來調用該方法。

TextView tv = (TextView)findViewById(R.id.textv); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PrintStream ps = new PrintStream(baos); 
System.setOut(ps); 
try { 
    //pick the entry class from the jar Manifest 
    //Main-Class: psae.HelloWorld 
    Class myClass = Class.forName("psae.HelloWorld"); 
    //since this has a package, there is no need of reflection.This is just an example 
    //If the jar file had just a default package, the it would have been something like the below line (and this is where it would be useful) 
    //Class myClass = Class.forName("Main"); 
    Method myMethod = myClass.getMethod("main", String[].class); 
    //parameters to the main method 
    String[] params = {"Aneesh","Joseph"}; 
    myMethod.invoke(null, (Object) params); 
    String output = baos.toString(); 
    tv.setText(output); 
} 
catch(Exception d) 
{ 
    tv.setText(d.toString()); 
}