0

自从我使用 C 以来已经很久了,所以我为这个简单的问题道歉。

我正在 armeabi-v7a 设备上使用 GPIO。我需要从 android 应用程序中将 GPIO 接口导出到用户空间,并且我正在尝试从 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)调用 shell 并为其提供所需的重定向
  • 使用popen(3)与类型"w"fprintf您的数据返回FILE*
  • 使用fork(2)exec*(3)生成新进程。在分叉之后但在执行之前,使用pipe(2),dup2(2)close(2)适当地设置新进程的标准输入。然后,您可以从父进程写入该文件描述符以设置数据。这是最复杂的选项,但它使您可以最大程度地控制子进程的设置方式。
于 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 回答