我目前有一个编译的 jar 文件,我想在 android 设备上使用它。代码使用 System.out.println() 输出到命令行。
我将如何创建一个包装器来获取标准输出并将其放在 android 设备上的文本视图中?我是否需要对 jar 进行任何更改(我确实拥有所有源代码)以允许包装器?
提前致谢。
我目前有一个编译的 jar 文件,我想在 android 设备上使用它。代码使用 System.out.println() 输出到命令行。
我将如何创建一个包装器来获取标准输出并将其放在 android 设备上的文本视图中?我是否需要对 jar 进行任何更改(我确实拥有所有源代码)以允许包装器?
提前致谢。
首先,您应该考虑 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
我认为你需要做出一些改变。您可以通过调用设置标准输出
System.setOut(PrintStream out)
// Reassigns the "standard" output stream.
out
您自己的将数据打印到文本视图的类在哪里。见摆动解决方案。只需设置附加到文本视图,您就可以使用此代码。
或者只创建一种方法
void log(String message);
您将文本附加到视图的位置。然后将所有println()
调用更改为此。
如果它是一个可执行的 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());
}