38

Nexus S (Android 4.0 を実行) でネイティブ stdout メッセージを logcat にリダイレクトできません。私はこれを行う必要があることを読みました:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

ただし、これは機能しないようです。(ただし、ここで述べたように、JUnit を壊すので、効果がないわけではありません。)

参考までに、私のコードは次のとおりです。

package com.mayastudios;

import android.util.Log;

public class JniTester {

  public static void test() {
    Log.e("---------", "Start of test");
    System.err.println("This message comes from Java.");    
    void printCMessage();
    Log.e("---------", "End of test");
  }

  private static native int printCMessage();

  static {
    System.loadLibrary("jni_test");
  }
}

JNI .c ファイル:

JNIEXPORT void JNICALL
Java_com_mayastudios_JniTester_printCMessage(JNIEnv *env, jclass cls) {
  setvbuf(stdout, NULL, _IONBF, 0);
  printf("This message comes from C (JNI).\n");
  fflush(stdout);

  //setvbuf(stderr, NULL, _IONBF, 0);
  //fprintf(stderr, "This message comes from C (JNI).\n");
  //fflush(stderr);
}

そして Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := jni_test
LOCAL_SRC_FILES := test_jni.c
include $(BUILD_SHARED_LIBRARY)

を呼び出すだけでこれをコンパイルしていndk-buildます。ネイティブ メソッドは正しく呼び出されますが、そこからログ出力が得られません (冗長であっても)。ただし、Java からログ出力を取得します (「このメッセージは Java から送信されます。」)。

私が間違っているかもしれないことのヒントはありますか?

PS: 問題を示す小さな Mercurial リポジトリをセットアップしました: https://bitbucket.org/skrysmanski/android-ndk-log-output/

4

6 に答える 6

17

setprop log.redirect-stdio trueJava コードによって生成された出力のみをリダイレクトしますが、ネイティブ コードはリダイレクトしません。この事実は、developer.android.comで次のように説明されています。

デフォルトでは、Android システムは stdout および stderr (System.out および System.err) の出力を /dev/null に送信します。Dalvik VM を実行するプロセスでは、システムに出力のコピーをログ ファイルに書き込むようにさせることができます。

ネイティブコードから出力を得るために、私はこのソリューションが本当に好きでした

于 2016-04-12T00:42:50.670 に答える
16

これは、以前の回答からは明らかではありませんでした。ルート化されたデバイスでも、次を実行する必要があります。

adb root
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
于 2013-09-21T19:43:11.190 に答える
12

また、ロギング コードをラップして Android かどうかを検出し、Android のロギングを使用できるようにする必要があります。これは、誰にとっても実用的である場合とそうでない場合があります。

ログ ヘッダー ファイルをインクルードします。

#include <android/log.h>

組み込みのロギング機能を使用します。

__android_log_print(ANDROID_LOG_INFO, "foo", "Error: %s", foobar);

于 2014-02-20T09:53:56.493 に答える
-1

fflush(stdout);printf の後に置いてみてください。または、代わりにfprintf(stderr, "This message comes from C (JNI).\n");を使用します。

デフォルトの stdout はバッファリングです。stderr - そうではありません。そして、Java の System.out ではなく、System.err を使用しています。

また、これで stdout バッファリングを無効にすることもできます:setvbuf(stdout, NULL, _IONBF, 0);最初の printf 呼び出しの前に呼び出すようにしてください。

于 2012-05-10T18:16:04.017 に答える