6

androidndkのHelloJniサンプルを変更しました。stdoutに何かを書き込みたいと思います。これがJniコードです:

#include <stdlib.h>
#include <jni.h>
#include <stdio.h>

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    printf("Hello from C !\n");
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

そしてこれは私のログです:

09-28 13:07:02.906: I/ActivityManager(1650): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.hellojni/.HelloJni u=0} from pid 1790
09-28 13:07:03.007: D/dalvikvm(1650): GC_FOR_ALLOC freed 687K, 10% free 9300K/10247K, paused 62ms, total 62ms
09-28 13:07:03.070: D/dalvikvm(3562): Not late-enabling CheckJNI (already on)
09-28 13:07:03.085: I/ActivityManager(1650): Start proc com.example.hellojni for activity com.example.hellojni/.HelloJni: pid=3562 uid=10052 gids={1015, 1028}
09-28 13:07:03.101: I/dalvikvm(3562): Turning on JNI app bug workarounds for target SDK version 3...
09-28 13:07:03.132: D/dalvikvm(3562): Debugger has detached; object registry had 1 entries
09-28 13:07:03.171: D/dalvikvm(3562): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318
09-28 13:07:03.179: D/dalvikvm(3562): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318
09-28 13:07:03.179: D/dalvikvm(3562): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318, skipping init
09-28 13:07:03.265: V/TabletStatusBar(1715): setLightsOn(true)
09-28 13:07:03.328: I/ActivityManager(1650): Displayed com.example.hellojni/.HelloJni: +279ms
09-28 13:07:07.078: E/ThrottleService(1650): problem during onPollAlarm: java.lang.IllegalStateException: problem parsing stats: java.io.FileNotFoundException: /proc/net/xt_qtaguid/iface_stat_all: open failed: ENOENT (No such file or directory)

log.redirect-stdioをtrueに設定したので、LogCatにHello行が表示されます。

誰かがこの仕事をする方法について考えを持っていますか?ありがとう。

より明確にするために、私がしたいのはstdoutで私の出力を見ることです。に問題はありません。stdoutに出力できるかどうかだけ知りたいです。ソリューション__android_log_printを提供してくれた人に感謝します。

4

3 に答える 3

16

Android スタジオ

Android Studio と gradle を使用する場合、Android.mk は無視されます。これを build.gradle ファイルに追加します。

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

エクリプス

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogAndroid.mk ファイルに追加する必要があります。

次のように、独自のヘルパー マクロを定義するだけで済みます...

#include <android/log.h>

#define LOGV(TAG,...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)
#define LOGD(TAG,...) __android_log_print(ANDROID_LOG_DEBUG  , TAG,__VA_ARGS__)
#define LOGI(TAG,...) __android_log_print(ANDROID_LOG_INFO   , TAG,__VA_ARGS__)
#define LOGW(TAG,...) __android_log_print(ANDROID_LOG_WARN   , TAG,__VA_ARGS__)
#define LOGE(TAG,...) __android_log_print(ANDROID_LOG_ERROR  , TAG,__VA_ARGS__)

非常にうまく機能します。

于 2012-09-28T11:41:36.427 に答える
15

Android ロギング関数を使用します。

#include <android/log.h>
.... 
__android_log_print(ANDROID_LOG_VERBOSE, "MyApp", "The value of n is %d", n);

質問が編集された後にこれを読んでいる人への注意: 質問はもともと、OP が <android/log.h>` の関数を使用したくないことを指定していませんでした。

于 2012-09-28T11:38:03.513 に答える
4

ネイティブ コードを介して Logcat に出力するには、Android のネイティブ ロガーを使用する必要があります。

そのようなもの:

#include <jni.h>
#include <android/log.h>

#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,DEBUG_TAG,__VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,DEBUG_TAG,__VA_ARGS__)

そして、関数内で使用します。

LOGD("hello");

これを機能させるには、コンパイルにネイティブ LOG を追加する必要があります: (Android.mk)

LOCAL_LDLIBS :=  -llog 
于 2012-09-28T11:40:04.813 に答える