Soru Android native ndk'de değişkenlerin günlüğe kaydetme değerleri


İle giriş yaptım C ++ Android NDK içinde.

Logcat'a şöyle bir mesaj yazabilirim:

__android_log_write(ANDROID_LOG_INFO, "tag here", "message here");

Şimdi diyelim ki bir tamsayı var testint. Bu int'nin değerini nasıl yazdırabilirim?

Böyle bir şey adresi yazdırıyor, ama değeri istiyorum. Hiçbir şey bulamadım C ++ Bunun nasıl yapılacağı hakkında. Herhangi bir yardım için teşekkürler!

__android_log_print(ANDROID_LOG_INFO, "sometag", "%p", *test);

44
2017-08-28 12:34


Menşei




Cevaplar:


Kullanabilirsin __android_log_print hangi kullanır sprintf-Veri verilerinizi bir dizgeye formatlayan sözdizimi.

__android_log_print(ANDROID_LOG_INFO, "sometag", "test int = %d", testInt);

41
2017-08-28 12:39





İşte gördüğüm en özlü yol:

#include <android/log.h>

#define  LOG_TAG    "someTag"

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

...

// Now you can log very simply like this:
int foo = 42;
LOGD( "This is a number from JNI: %d", foo );

Ayrıca, Android.mk'deki günlük kitaplığına bağlandığınızdan emin olun:

LOCAL_LDLIBS    := -llog

59
2017-11-21 02:10



Bunu kullanarak c ++ dizesini nasıl yazdırabilirim? - Noman Akhtar
aynı şekilde sadece tanımlanan makroyu çağırır: LOGI ("Bu bir String"); - Teocci
Ah adam! Bu harika! Bu makroları 4 yıl önce kullandım ve yine buradayım! Teşekkürler ;) - Ahmed Hegazy


Kullanabileceğiniz variadic log yazdırma işlevinden yararlanın. Kendi kodum için, basit yapmak için bir LogInfo () işlevi sağlarım. Tabii ki burada size sunulan birkaç seçenek var.

void LogInfo(const char *sTag, const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  __android_log_vprint(ANDROID_LOG_INFO, sTag, fmt, ap);
  va_end(ap);
}

11
2017-08-28 12:46



Yukarıdaki uygulamak için en iyi ... güzel - Houston
Bu çözüm @mah için teşekkürler, ancak tam olarak yukarıda gösterildiği gibi uygulayarak aşağıdaki hatayı alıyorum: A/libc(18350): Fatal signal 7 (SIGBUS) at 0x00000000 (code=128), thread 18410 (WebViewCoreThre). Ayrıca, doğru bellek adresine işaret etmedikleri sürece parametreler doğru şekilde yazdırılmaz. Bunun hakkında bir fikrin var mı? Çok teşekkürler - Lisarien
Aslında kullanmak için hata yaptım __android_log_print yerine __android_log_vprint. Bu sonuncusuyla, değerler konsolda iyi görüntüleniyor, ancak birkaç saniyeden sonra her zaman yukarıdaki hatayı alıyorum ve uygulama öldürülüyor. - Lisarien
@Lisarien yapıştırdığınız hatayı bir NULL bellek konumuna erişmeye çalıştığınız anlamına gelir - muhtemelen düzgün şekilde başlatılmamış bir işaretçiyi kullanıyorsunuzdur. Stack Overflow'un yorum özelliği ile teşhis edilmesi için çok fazla olasılık var. Hatanın gerçekleştiği satırı tam olarak bulmayı denemenizi öneririm (kodunuzun ne kadar uzak olduğunu görmek için fazladan günlük ifadeleri ekleyerek). Hala bunu anlayamıyorsanız, hatayla ve kilitlenmenin gerçekleştiği kodla birlikte bir soru göndermelisiniz. - mah
Gördüğünüz şeyin sebebini bilmiyorum (bu, yeni bir soru olarak yayınlamanın bir başka iyi sebebi; sadece benden daha fazla dikkat çekersiniz). Yine de hızlı bir düzeltme yapmak isterseniz, açıklamanız, @ Adam'ın makro tabanlı öneri (bu sayfadaki yanıtı) beğenirsiniz. - mah


__android_log_print () bir biçim dizesi ve değişken bağımsız değişken listesi alır. İmzalı bir tamsayı yazdırmak için aradığınız format belirteci "% d" dir. Yani böyle bir şey istediğin şey:

int foo = 42;
__android_log_print(ANDROID_LOG_INFO, "SomeTag", "foo is %d", foo);

Biçim dizeleri hakkında daha fazla bilgi için, sprintf kılavuzu.


11
2017-08-29 07:03



Bu kabul edilebilir cevap olmalı - hB0