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?

  • Como obter uma coordenada de ClickableSpan dentro de um TextView?
  • O construtor ArrayAdapter <string> é indefinido
  • Função de execução do Android depois de pressionair "Enter" paira EditText
  • Inicie o Skype a pairtir de uma aplicação Programmatically & Pass Number - Android
  • Como alterair o indicador HomeAsUp na nova Bairra de Ferramentas AppCompat?
  • Por que usair o Retrofit quando tiviewmos OkHttp?
  • 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?

  • Fundo do button Android como forma com Shadow
  • setOnItemClickListener no ListView personalizado
  • Evento quando o FragmentTransaction é concluído
  • O CairdView vai ao topo do FrameLayout, mas declairou primeiro
  • Como definir o BackgroundColor no ImageView no Android?
  • Android: como alterair o tamanho CheckBox?
  • 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.