我目前有一个编译的jar文件,我想在Android设备上使用。代码使用System.out.println()输出到命令行。
我如何创建一个包装器来获取stdout并将其放在Android设备的文本视图中?我是否需要对jar进行任何更改(我确实拥有所有源代码)以允许包装器?
提前致谢。
答案 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());
}