現在、Androidデバイスで使用したいコンパイル済みのjarファイルがあります。コードは、System.out.println()を使用してコマンドラインに出力します。
stdoutを取得してAndroidデバイスのテキストビューに配置するラッパーを作成するにはどうすればよいですか?ラッパーを許可するには、jarに変更を加える必要がありますか(すべてのソースコードがあります)?
前もって感謝します。
現在、Androidデバイスで使用したいコンパイル済みのjarファイルがあります。コードは、System.out.println()を使用してコマンドラインに出力します。
stdoutを取得してAndroidデバイスのテキストビューに配置するラッパーを作成するにはどうすればよいですか?ラッパーを許可するには、jarに変更を加える必要がありますか(すべてのソースコードがあります)?
前もって感謝します。
いくつかの変更を加える必要があると思います。呼び出して標準出力を設定できます
System.setOut(PrintStream out)
// Reassigns the "standard" output stream.
out
データをテキスト ビューに出力する独自のクラスはどこにありますか。スイングソリューションを参照してください。テキストビューへの追加を設定するだけで、このコードを使用できます。
または、メソッドを 1 つ作成するだけです
void log(String message);
ビューにテキストを追加する場所。次に、すべてのprintln()
呼び出しをこれに変更します。
実行可能なjarファイルの場合、ここに実際の例があります
この単純な実行可能な HelloWorld jar ファイルを Android プロジェクトのビルド パスに追加します。
jar ファイルにパッケージが含まれていない場合は、 を使用Reflection
してメソッドを呼び出す必要があります。それ以外の場合は、クラス ファイルをインポートしてメイン メソッドを直接呼び出すことができます (この例の 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());
}
まず、Android には Dalvik と呼ばれる特定の Java VM があり、その下で jar を実行できないことを考慮する必要があります。
出力が発生する jar 内に 1 つのポイントがある場合、最良のオプションは、通常のアプリケーションを で作成し、その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