1

スクリーンショット コマンドを C で実行したいのですが"adb shell /system/bin/screencap -p /sdcard/img.png"、同じものを検索していたところ、別のコマンドの解決策が得られ、コマンドを次のように変更しました。

execl("/system/bin/screencap", "-p", "storage/sdcard0/screenShot.png", (char *)NULL);

しかし、アプリケーションを実行して上記のコマンドのメソッドを呼び出すと、アプリケーションがクラッシュします。

/system/bin/screencap -p /sdcard/img.png" " コマンドを C コードから実行するにはどのように変更すればよいですか?


トムの回答後に更新

アプリケーションが再び閉じられ、ここにログがあります

06-21 11:52:01.488: I/WindowState(279): WIN DEATH: Window{40fed2c0 u0 com.mytest.ndktestapplication/com.mytest.ndktestapplication.MainActivity}
06-21 11:52:01.498: I/ActivityManager(279): Process com.mytest.ndktestapplication (pid 7745) has died.
06-21 11:52:01.498: W/ActivityManager(279): Force removing ActivityRecord{40ea9ab8 u0 com.mytest.ndktestapplication/.MainActivity}: app died, no saved state
4

2 に答える 2

3

これは、exec() ファミリ関数の予期される結果です。

彼らがすることは、現在のプログラムを指定されたものに置き換えることです。さようならアプリ。

これを避けるには、最初に fork() を呼び出してから、子でのみ exec() を呼び出す必要があります。次のようにします。

if (!fork()) {
    // fork() returned zero, so we are in the child
    execl...
}

exec 関数を呼び出す前に、クリーンアップを行う必要がある場合もあります。

ただし、ほとんどのデバイスではアプリからスクリーンショットを取得できないことに注意してください。これは、アプリケーション コードが権限のないユーザー ID で実行されるためです。 しかし、一部のデバイスがこの機能の許可チェックなしで出荷された狭い期間があったことを思い出したようです。

于 2013-06-21T12:08:39.720 に答える
1

呼び出しは

execl(path, arg0, arg1, ..., (char*) NULL);

2 番目の引数 はarg0、プログラムを呼び出すために使用されたというプログラムの名前です。プログラムに与えられる実際の引数は、 から始まるだけarg1です。

したがって、コードを次のように変更する必要があります

execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);
于 2013-06-21T11:45:08.470 に答える