http://hi.baidu.com/grfillzaccbaqwq/item/b8dc91da94576e12d90e4490
http://www.cnblogs.com/melode11/archive/2009/10/15/1584120.html
【11.04.02】在Android C/C++層添加LOG調試(LOGI\LOGD\LOGE...)輸出支援
最近在研究Android 2.3.3原始碼的C/C++層,需要對代碼進行一些調試,但是奇怪的是,直接添加LOGD("XXXXXXXX");,使用logcat卻看不到任何輸出,換成LOGI、LOGV、LOGW、LOGE也沒有效果。於是在網上尋找解決方案,經過幾次實驗,終於找到了,現在貼到下面備忘:
第一步:在對應的mk檔案中加入:LOCAL_LDLIBS := -llog
第二步:在要使用LOG的cpp檔案中加入:
#include <android/log.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "keymatch", __VA_ARGS__)
第三步:這樣就可以使用了:LOGD("我要看到的調試資訊^_^"); 這樣,在logcat端看到的輸出是:D/keymatch( 32):我要看到的調試資訊^_^ 如果想改變輸出中的各項內容,可以參考相應顏色的標示,比如,如果想定義LOGE,就可以把上面的ANDROID_LOG_DEBUG改成ANDROID_LOG_ERROR,同理,LOGI神馬的也都以此類推:
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)
當然,如果不嫌麻煩,也可以直接使用__android_log_print函數,而不define定義LOGxxx 如果還想瞭解更詳細的內容,也可以參考這篇文章: 《在android 輸出log 資訊 用於調試》 另外,有文章稱此方法在編譯動態庫的時候可能會出問題,會提示cannot find -llog的錯誤。意思是找不到liblog.so這個庫檔案。 因此需要改成 LOCAL_LDLIBS:= -L$(SYSROOT)/usr/lib -llog 才可以正常編譯。但是我這邊編譯動態庫的時候,好像不用這樣改也行,沒發現編譯時間提示“cannot find -llog”的錯誤。如果您在實踐過程中發現有這樣的問題,可以參考該文章,連結在此:《如何在android native編程中使用logCat》 Android NDK發布後,java+C的編程方式成為android上效能編程的首選。但在C中調試困難,因此能使用logcat成為必須的要求。 關於在Native代碼中使用logcat,網上有很多說法,大部分有所欠缺,有的根本是錯的。 要使用logcat,首先在代碼中要引入 log的標頭檔。#include <android/log.h> 然後你可以簡單的通過__android_log_write(ANDROID_LOG_ERROR,"Tag","Message"); 方法向logcat輸出。log 層級有很多 : ANDROID_LOG_UNKNOWN, ANDROID_LOG_DEFAULT, ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT, 這樣寫完以後,如果直接編譯,就會報 __android_log_write 方法undefined.怎麼回事呢?關鍵是在設定編譯選項上面。在Android.mk檔案裡,可以指定一個LOCAL_LDLIBS的參數。如果不指定,那麼編譯的時候,只會引入預設的幾個重要的lib,比如libc之類的。如果要用log,那就要把 liblog給引進來。網上很多的寫法是 LOCAL_LDLIBS := -llog ,這在build static lib的時候沒什麼問題。如果是build shared lib,就會報個 cannot find -llog的錯誤。意思是找不到liblog.so這個庫檔案。因此需要改成 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 才可以正常編譯。其中-L參數是指定了搜尋lib的路徑。下面是一個android.mk的內容的例子:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := TestNdkNetworkLOCAL_SRC_FILES := HttpConnection.cppLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRARY)