我目前有一個編譯好的jar文件,我想在android設備上使用。代碼使用System.out.println()輸出到命令行。Android設備上的命令行Jar
我該如何創建一個包裝來抓取標準輸出並將其放在android設備的文本視圖中?我是否需要對jar進行任何更改(我擁有所有源代碼)以允許封裝?
在此先感謝。
我目前有一個編譯好的jar文件,我想在android設備上使用。代碼使用System.out.println()輸出到命令行。Android設備上的命令行Jar
我該如何創建一個包裝來抓取標準輸出並將其放在android設備的文本視圖中?我是否需要對jar進行任何更改(我擁有所有源代碼)以允許封裝?
在此先感謝。
我想你需要做一些改變。你可以通過調用
System.setOut(PrintStream out)
// Reassigns the "standard" output stream.
哪裏out
是你自己的類,將打印數據以文本視圖設置非標準輸出。請參閱swing solution。只需設置附加到文本視圖,您可以使用此代碼。
或者只是創建一個方法
void log(String message);
在這裏你添加文本視圖。然後將所有println()
調用更改爲此。
首先你應該考慮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
如果它在這裏一個可執行的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());
}
事實上@alaster解決方案更加優雅 –