2016-07-16 22 views
3

AndroidでDelphi 10でコマンドラインを実行しようとしていて、コマンドの出力を取得しようとしています。Delphi 10 - Androidでコマンドラインを実行してライブを出力する

私はここからファイルを使用しています:ここで

https://github.com/FMXExpress/android-object-pascal-wrapper/tree/master/android-23

は私のコードです:ケン・ホワイトの素敵なコメント

uses Classes, 
    Androidapi.Helpers, 
    java.lang.Process, java.lang.Runtime, 
    java.io.OutputStream, java.io.InputStream, 
    java.io.InputStreamReader, java.io.BufferedReader; 

procedure Execute(sCmd: string; sOut : TStringList); 
var Process : JProcess; 
    Runtime : JRuntime; 
    Input : JInputStream; 
    BuffInput : JBufferedReader; 
begin 

    Process := TJRuntime.JavaClass.getRuntime.exec(StringToJString(sCmd)); 
    //Input := JInputStream(Process.getInputStream); 
    BuffInput := JBufferedReader(jInputStreamReader(Process.getInputStream)); 
while (s = '') do 
begin 
    s := JStringToString(BuffInput.readLine); 
    sOut.Add(s); 
end; 

//--- Compile but get Segmentation fault(11) at 
// s := JStringToString(BuffInput.readLine); 

end; 
+0

あなたがのためにAndroidのドキュメントを読みました[ ' InputStream'](https://developer.android.com/reference/java/io/InputStream.html)と['OutputStream'](https://developer.android.com/reference/java/io/OutputStream.html )クラスはまだですか? –

+1

どのようにしてあなたは立ち往生していますか? –

+0

-Remy、はい私はそれを読んだが、私は今までどんな結果も得ていない、ごめんなさい。 –

答えて

1

おかげで、私は、問題の詳細をディグ。

1:私はjava.io.InputStreamをAndroidapi.JNI.JavaTypesを使用する必要はありません - 私はjava.io.InputStreamを

2から使用している場合> Input.availableは常に0である:私のコマンドを実行した後、私はProcess.waitForをする必要があります。私はゲスト私は、古き良きDOSのようなライブの出力を持つことができません

3:誰かがこれを行うには良い方法を知っていれば、あなたの歓迎:P

procedure Execute(sCmd: string; sOut : TStringList); 
var Process : JProcess; 
    Runtime : JRuntime; 

    Input : JInputStream; 

    x, bufflen: Integer; 

    s: string; 
    buff : TJavaArray<Byte>; 

begin 
    Process := TJRuntime.JavaClass.getRuntime.exec(StringToJString(sCmd)); 
    Process.waitFor; 

    Input := Process.getInputStream; 
    bufflen := Input.available; 

    buff := TJavaArray<Byte>.Create(bufflen); 
    Input.read(buff); 

    s := ''; 

    for x := 0 to bufflen - 1 do 
    s := s + chr(buff[x]); 

    sOut.Add(s); 

end; 
関連する問題