2012-09-28 1 views
4

안드로이드 SDK의 HelloJni 샘플을 변경했습니다. 표준 출력에 무엇인가 쓰고 싶습니다. 여기에 JNI 코드 :JNI Android에서 stdout에 작성 하시겠습니까? <android/log.h>가 없으면

#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 !"); 
} 

그리고 이것은 내 로그입니다 : 내 로그 캣의 안녕 라인을 볼 수 있도록 내가 true로 log.redirect - 표준 입출력을 설정 한

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) 

.

누군가이 작업을하는 방법에 대한 아이디어가 있습니까? 감사.

더 명확히 말하면, 내가하고 싶은 것은 stdout에서 출력물을 보는 것입니다. 아무런 문제가 없다. 출력을 stdout으로 할 수 있는지 여부를 알고 싶다. 누구에게 __android_log_print 솔루션을 제공해 주셔서 감사합니다.

+1

더 명확히 말하면, 내가하고 싶은 것은 stdout에서 출력을 보는 것입니다. 이것이 JNI에서 수행 될 수 있는지 알아보기위한 약간의 테스트가 있습니다. 이 문제는 에 아무런 문제가되지 않으며 표준 출력으로 출력 할 수 있는지 여부를 알고 싶습니다. – user1706070

+0

에뮬레이터 또는 루팅 된 기기에서 [redirect] (http://developer.android.com/tools/debugging/debugging-log.html#viewingStd)가 작동합니다. –

+0

[is "std :: cout"이 Android- ndk] (http://stackoverflow.com/questions/8870174/is-stdcout-usable-in-android-ndk) –

답변

11

사용을 안드로이드 로깅 기능 : 질문 후이 글을 읽는 사람들에게

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

참고 편집 한 : 문제는 원래 영업 이익은 <의 기능을 사용하지 않았 음을 지정하지 않은 android/log.h>`를 사용하십시오.

4

원시 코드를 통해 Logcat으로 인쇄하려면 Android의 기본 Logger를 사용해야합니다. 그런

그 무언가 :

#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__) 

그리고 당신은 당신의 함수 내에서 사용 :

당신이 컴파일에 네이티브 LOG를 추가해야합니다 일이 위해서는
LOGD("hello"); 

: (Android.mk)

LOCAL_LDLIBS := -llog 
12

안드로이드 스튜디오

Android Studio 및 gradle을 사용하는 경우 Android.mk가 무시됩니다. 당신의 build.gradle 파일이 추가 :

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

이클립스

당신이 당신의 Android.mk 파일에 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog을 추가 할 필요가

을 ..

당신이 당신 자신의 헬퍼 매크로를 정의 할 필요가

, 이런 ...

#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__) 

매우 잘 작동합니다.

+0

Android.Gradle에서 Android Studio를 사용하면 mk 파일이 무시됩니다. http://stackoverflow.com/a/28004606/4449456을 참조하십시오. –