0

Cを使ってからずっと経っているので、簡単な質問で申し訳ありません。

armeabi-v7a デバイスで GPIO を使用しています。GPIO インターフェイスを Android アプリ内からユーザー空間にエクスポートする必要があり、JNI ライブラリからエクスポートしようとしています。

端末からこれを行うには、実行するだけですecho 199 > /sys/class/gpio/export

しかし、私はJNIからそれを行う必要があります:(

私の現在の試みは(いくつかのエラー処理で)次のように見えますが、うまくいきません:

JNIEXPORT jboolean JNICALL Java_com_rnd_touchpanel_LED_exportGreen
    (JNIEnv * je, jclass jc)
{
    freopen("/sys/class/gpio/export", "w+", stdout);
    printf("198");
    fclose(stdout);
    return JNI_TRUE;
}

その後、エクスポートは実際には単なるファイルではなくバイナリであることに気付き、新しいプロセスを生成して入力などを送信する方法を忘れていました。誰かが私の記憶をリフレッシュしてくれませんか? ありがとう!

4

2 に答える 2

2

ファイルを書き込んでいるだけの場合は、リダイレクトする必要はありません。stdoutファイルを で開き、fopen(3)で書き込みfprintf(3)、 で閉じるだけfclose(3)です。

標準で特定のデータを使用して別のプロセスを実行する必要がある場合は、いくつかのオプションがあります。

  • system(3)シェルを呼び出して、必要なリダイレクトを与えるために使用します
  • popen(3)タイプ"w"とデータを使用しfprintfて返されるFILE*
  • と を使用fork(2)exec*(3)て、新しいプロセスを生成します。fork 後、exec する前にpipe(2)dup2(2)close(2)を使用して、新しいプロセスの stdin を適切にセットアップします。その後、親プロセスからそのファイル記述子に書き込み、データをセットアップできます。これは最も複雑なオプションですが、子プロセスのセットアップ方法を最も細かく制御できます。
于 2013-01-15T20:59:42.960 に答える
1

私はC/C++をたくさんやったのでしばらく経ちましたが、新しいプロセスの生成はpopenを介して行われると思います。例えば:

FILE* pOutput = popen("/usr/bin/python myscript.py", "r");
  while ( fgets(line, 199, pOutput) )
  {
    printf("%5d: %s", entry++, line);
  }

S/O に関する別の投稿から、proc を書き込みモードで開くと、popen によって返される FILE* に書き込むことができるようです。

FILE * file = popen("/bin/cat", "w");
fwrite("hello", 5, file);
pclose(file);
于 2013-01-15T20:55:41.150 に答える