Android设备上的命令行Jar

时间:2012-05-29 19:21:54

标签: android jar command-line-interface

我目前有一个编译的jar文件,我想在Android设备上使用。代码使用System.out.println()输出到命令行。

我如何创建一个包装器来获取stdout并将其放在Android设备的文本视图中?我是否需要对jar进行任何更改(我确实拥有所有源代码)以允许包装器?

提前致谢。

3 个答案:

答案 0 :(得分:0)

我认为你需要做一些改变。您可以通过调用

来设置标准输出
System.setOut(PrintStream out) 
// Reassigns the "standard" output stream.

out是您自己的类,它将数据打印到文本视图。见swing solution。只需设置附加到文本视图,您就可以使用此代码。

或者只创建一个方法

void log(String message);

将视图附加到视图的位置。然后将所有println()次呼叫更改为此。

答案 1 :(得分:0)

首先你应该考虑Android有一个名为Dalvik的特定Java VM,而不是任何jar都可以在它下运行。

  • 如果你的jar中有一点输出,最好的选择是用TextView创建一个普通的应用程序,在你的构建路径中包含你的jar并替换{{1输出到它:

    println()
  • 如果有很多输出来源,您可以使用public void print(String msg) { mTextView.setText(msg); } 运行jar并使用它的java.lang.Process方法来阅读打印的消息:

    getInputStream()

答案 2 :(得分:0)

如果它是可执行的jar文件,这是一个工作示例

将这个简单的可执行文件HelloWorld jar file添加到Android项目的构建路径

如果jar文件没有包,那么你将不得不使用Reflection来调用它中的方法。另外,你可以直接导入类文件并直接调用main方法。(这个例子) jar有一个包“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());  
 }