2012-05-10 15 views
29

में लॉककैट को रीडायरेक्ट करने के लिए रीडायरेक्ट करें, मुझे मूल नेडआउट संदेश को लॉगकैट पर रीडायरेक्ट करने के लिए अपना Nexus S (Android 4.0 चला रहा है) नहीं मिल सकता है। मैंने पढ़ा है कि मुझे यह करने की ज़रूरत है:एंड्रॉइड एनडीके

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

हालांकि, यह काम नहीं प्रतीत होता है। (यह JUnit तोड़ने हालांकि, के रूप में उल्लेख here करता है, तो यह प्रभाव के बिना नहीं है।)

संदर्भ के लिए, मेरे कोड है:

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 ग फ़ाइल:

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) 

मैं सिर्फको फोन करके इस संकलन कर रहा हूँ। देशी विधि को सही ढंग से बुलाया जाता है लेकिन मुझे इससे कोई लॉग आउटपुट नहीं मिलता है (यहां तक ​​कि वर्बोज़ पर भी)। मुझे जावा से लॉग आउटपुट मिलता है हालांकि ("यह संदेश जावा से आता है।")।

कोई संकेत जो मैं गलत कर रहा हूं?

पुनश्च: https://bitbucket.org/skrysmanski/android-ndk-log-output/

+0

इस questino में मेरा उत्तर की जाँच करें - http : //stackoverflow.com/questions/10274920/how-to-get-printf-messgaes-written-in-ndk-application/10275209#10275209 – Shaiful

+1

मुझे इस समाधान के बारे में पता है (और यही वह है जो मैंने उपयोग किया है)। हालांकि, मूल प्रश्न अभी भी बनी हुई है। शायद यह सिर्फ एक बग है। –

+0

क्या आपने setvbuf कॉल को हटाने का प्रयास किया है? मेरे पास fflush द्वारा कोड में सही ढंग से लॉग में दिखाए गए printf द्वारा निर्धारित किया गया है जो setvbuf का उपयोग नहीं करता है। –

उत्तर

-1

अपने printf के बाद fflush(stdout); डालने का प्रयास करें: मैं एक छोटे से मर्क्युरियल भंडार है कि समस्या को दर्शाता है स्थापित किया है। या वैकल्पिक रूप से fprintf(stderr, "This message comes from C (JNI).\n") का उपयोग करें;

डिफ़ॉल्ट रूप से stdout बफरिंग है। stderr - नहीं है। और आप System.err का उपयोग कर रहे हैं, जावा से System.out नहीं।

इसके अलावा आप इसके साथ stdout बफरिंग अक्षम कर सकते हैं: setvbuf(stdout, NULL, _IONBF, 0); बस सुनिश्चित करें कि आप इसे पहले printf कॉल से पहले कॉल करते हैं।

+0

दुर्भाग्य से, न तो "fflush()" और न ही "setvbuf()" का कोई प्रभाव पड़ता है - भले ही मैं stdout या stderr का उपयोग करता हूं। मैंने इसे पहले "fflush()" के साथ परीक्षण किया था, लेकिन मैं इसे अपने उदाहरण में जोड़ना भूल गया था। अब मेरे पास है। –

7

stdout/stderr को एंड्रॉइड ऐप्स में /dev/null पर रीडायरेक्ट किया गया है। सेटप्रॉप वर्कअराउंड जड़ वाले उपकरणों के लिए हैक है जो लॉग पर stdout/stderr की प्रतिलिपि बनाता है। Android Native Code Debugging देखें।

15

यह पिछले उत्तरों से मुझे स्पष्ट नहीं था। यहां तक ​​कि जड़ें उपकरणों पर आप को चलाने के लिए की जरूरत है:

adb root 
adb shell stop 
adb shell setprop log.redirect-stdio true 
adb shell start 
+2

यह आउटपुट प्राप्त करने के लिए काम करता है लेकिन यह सिर्फ मुझे पागल कर देता है - कोई भी नया ऐप बिल्ड सही ढंग से इंस्टॉल नहीं होगा! – hooby3dfx

+1

यह मेरे लिए काम नहीं किया। इससे पहले कि मैं एक ऐप लॉन्च कर सकूं, मुझे इसे फिर से झूठ में बदलना पड़ा –

+0

सैमसंग एस 3 –

9

तुम भी अगर यह एंड्रॉयड है और यदि ऐसा है तो एंड्रॉयड की लॉगिंग का उपयोग पता लगाने के लिए अपने प्रवेश कोड रैप करने के लिए सक्षम होना चाहिए। यह हर किसी के लिए व्यावहारिक हो सकता है या नहीं भी हो सकता है।

#include <android/log.h>

उपयोग लॉगिंग कार्यक्षमता में बनाया गया:

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

+0

यह एक आकर्षण की तरह काम करता है! – Sharm

4

setprop log.redirect-stdio true केवल जावा कोड, द्वारा उत्पन्न उत्पादन नहीं बल्कि मूल कोड पुनर्निर्देश

प्रवेश हेडर फाइल को शामिल करें। इस तथ्य को निम्नलिखित तरीके से described on developer.android.com है:

डिफ़ॉल्ट रूप से, एंड्रॉयड प्रणाली/dev/बातिल को stdout और stderr (System.out और System.err) आउटपुट भेजता है।दल्विक वीएम चलाने वाली प्रक्रियाओं में, आप सिस्टम को आउटपुट की प्रतिलिपि लॉग फ़ाइल में लिख सकते हैं।

मूल कोड से उत्पादन प्राप्त करने के लिए, मैं वास्तव में this solution

+1

यहां लिंक किया गया समाधान समाधान के रूप में चिह्नित किया जाना चाहिए क्योंकि इसे rooting या किसी अन्य विशेष विशेषाधिकार की आवश्यकता नहीं है। बस एक "init" फ़ंक्शन को कॉल करें और सभी कोउट कॉल लॉगकैट में समाप्त हो जाएं ... मीठा। – gnichola

0

यहाँ पसंद आया कोड मैं उत्पादन stdout और stderr करने के लिए करने के लिए उपयोग करने के लिए लॉग इन करें android

#include <android/log.h> 
#include <pthread.h> 
#include <unistd.h> 

static int pfd[2]; 
static pthread_t loggingThread; 
static const char *LOG_TAG = "YOU APP LOG TAG"; 

static void *loggingFunction(void*) { 
    ssize_t readSize; 
    char buf[128]; 

    while((readSize = read(pfd[0], buf, sizeof buf - 1)) > 0) { 
     if(buf[readSize - 1] == '\n') { 
      --readSize; 
     } 

     buf[readSize] = 0; // add null-terminator 

     __android_log_write(ANDROID_LOG_DEBUG, LOG_TAG, buf); // Set any log level you want 
    } 

    return 0; 
} 

static int runLoggingThread() { // run this function to redirect your output to android log 
    setvbuf(stdout, 0, _IOLBF, 0); // make stdout line-buffered 
    setvbuf(stderr, 0, _IONBF, 0); // make stderr unbuffered 

    /* create the pipe and redirect stdout and stderr */ 
    pipe(pfd); 
    dup2(pfd[1], 1); 
    dup2(pfd[1], 2); 

    /* spawn the logging thread */ 
    if(pthread_create(&loggingThread, 0, loggingFunction, 0) == -1) { 
     return -1; 
    } 

    pthread_detach(loggingThread); 

    return 0; 
} 
+0

हमें एक मानक तरीके की आवश्यकता नहीं है जो कामकाज नहीं है। –

संबंधित मुद्दे