0

現在、Androidデバイスで使用したいコンパイル済みのjarファイルがあります。コードは、System.out.println()を使用してコマンドラインに出力します。

stdoutを取得してAndroidデバイスのテキストビューに配置するラッパーを作成するにはどうすればよいですか?ラッパーを許可するには、jarに変更を加える必要がありますか(すべてのソースコードがあります)?

前もって感謝します。

4

3 に答える 3

0

いくつかの変更を加える必要があると思います。呼び出して標準出力を設定できます

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

outデータをテキスト ビューに出力する独自のクラスはどこにありますか。スイングソリューションを参照してください。テキストビューへの追加を設定するだけで、このコードを使用できます。

または、メソッドを 1 つ作成するだけです

void log(String message);

ビューにテキストを追加する場所。次に、すべてのprintln()呼び出しをこれに変更します。

于 2012-05-29T19:39:29.187 に答える
0

実行可能な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());  
 }
于 2012-05-29T20:19:27.983 に答える
0

まず、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
    
于 2012-05-29T19:49:02.900 に答える