0

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

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

提前致谢。

4

3 回答 3

0

首先,您应该考虑 Android 有一个名为 Dalvik 的特定 Java VM,并且不能在其下运行任何 jar。

  • 如果您的 jar 中有一个点出现输出,最好的选择是创建一个带有 a 的常用应用程序TextView,将您的 jar 包含到它的构建路径中,并将对它的调用替换为对它的println()输出:

    public void print(String msg) {
        mTextView.setText(msg);
    }
    
  • 如果有很多输出来源,您可以使用 jar 运行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
    
于 2012-05-29T19:49:02.900 回答
0

我认为你需要做出一些改变。您可以通过调用设置标准输出

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

out您自己的将数据打印到文本视图的类在哪里。见摆动解决方案。只需设置附加到文本视图,您就可以使用此代码。

或者只创建一种方法

void log(String message);

您将文本附加到视图的位置。然后将所有println()调用更改为此。

于 2012-05-29T19:39:29.187 回答
0

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

将这个简单的可执行 HelloWorld jar 文件添加到您的 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());  
 }
于 2012-05-29T20:19:27.983 回答