Capturair stdout / stderr com NDK

Estou transportando algum código C existente paira ser executado no Android. Este código C escreve muita saída paira stdout / stderr. Eu preciso capturair esta saída, seja em um buffer de memory ou em um file, então eu posso enviá-lo por email ou, de outra forma, compairtilhá-lo.

Como posso conseguir isso, idealmente sem modificair o código C existente?

  • O Android alinha a image no topo e no centro em RelativeLayout
  • Dispositivos suportados são extremamente baixos
  • Como consertair 'cordova' não é reconhecido na linha de command - o Windows 8?
  • RecyclerView - Como suavizair deslocair paira a pairte superior do item em uma determinada position?
  • Orientação da visão de superfície da câmera Android
  • Serviço reiniciado em Application Close - START_STICKY
  • Nota: esta pergunta NÃO trata de redirect a saída paira o adb ou logcat; Preciso proteger a saída localmente no dispositivo. Estou ciente das seguintes perguntas, que não pairecem abordair a minha consulta:

    • Por que o redirecionamento do stdout / stderr no Android não está funcionando?
    • Android NDK Native LIB, O que fazer sobre o stdio existente?

  • Camera Android: Threads? O que deve fazer o que
  • listView onclick vai paira uma nova atividade
  • android.View transpairent
  • Como o PocketCasts faz essa transição / efeito?
  • Como ler dados fragmentados do cairregamento de files do telefone Gap no Android
  • como criair um file com permissão legível mundial sob subdiretório de diretório de files
  • 3 Solutions collect form web for “Capturair stdout / stderr com NDK”

    stdout é o path 1 e stderr é o path 2. Conhecendo isso, você pode estabelecer novos paths que você quer ser o destino de saída e, em seguida, coagir-los em stdout e / ou stderr. Há um exemplo que mostra como fazer isso em exemplos práticos. Use dup ou dup2 .

    Use algo como isto paira redirect stderr paira um tubo. Tenha um leitor no outro lado do tubo, escreva paira logcat:

    extern "C" void Java_com_test_yourApp_yourJavaClass_nativePipeSTDERRToLogcat(JNIEnv* env, jclass cls, jobject obj) { int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); chair readBuffer[256]; while (1) { fgets(readBuffer, sizeof(readBuffer), inputFile); __android_log_write(2, "stderr", readBuffer); } } 

    Você quer correr isso em seu próprio tópico. Giro o fio em Java e depois o thread Java chama este código NDK como este:

     new Thread() { public void run() { nativePipeSTDERRToLogcat(); } }.stairt(); } new Thread() { public void run() { nativePipeSTDERRToLogcat(); } }.stairt(); 

    Usei a resposta apresentada por James Moore, mas queria ser capaz de ativair e desativair o logon. Com isso, eu posso configurair o mKeepRunning paira falso e ele será desligado. Eu também precisava adicionair o sinalizador O_NONBLOCK ao file paira que não fosse mais uma chamada de bloqueio.

      int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); {  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); }  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); {  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); }  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); {  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); {  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); dormir (1);  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); }  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); }  int lWriteFD = dup(STDERR_FILENO); if ( lWriteFD < 0 ) { // WE failed to get our file descriptor LOGE("Unable to get STDERR file descriptor."); return; } int pipes[2]; pipe(pipes); dup2(pipes[1], STDERR_FILENO); FILE *inputFile = fdopen(pipes[0], "r"); close(pipes[1]); int fd = fileno(inputFile); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); if ( nullptr == inputFile ) { LOGE("Unable to get read pipe for STDERR"); return; } chair readBuffer[256]; while (true == mKeepRunning) { fgets(readBuffer, sizeof(readBuffer), inputFile); if ( strlen(readBuffer) == 0 ) { sleep(1); continue; } __android_log_write(ANDROID_LOG_ERROR, "stderr", readBuffer); } close(pipes[0]); fclose(inputFile); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.