1. 程式人生 > >jni中的日誌輸出到LOGCAT

jni中的日誌輸出到LOGCAT

在Java環境下使用JNI時可以方便的使用printf函式列印資訊,在Eclipse控制檯Console檢視可以方便的觀察到,可在Android環境下使用JNI的話,printf函式就無效了,LogCat檢視和Console視圖裡看不到任何輸出.但在android程式設計java程式碼中,我們使用Log.v等一些將日誌輸出到logcat,在LogCat檢視中可以看到日誌輸出資訊。

android NDK完全支援JNI本地方法除錯。它提供4個android_log_XXX函式供我們使用。
路徑:/build/platforms/android-X/arch-arm/usr/include/android/log.h

在這個標頭檔案中,會看到以下定義:

typedef enum android_LogPriority {
    ANDROID_LOG_UNKNOWN = 0,
    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_LogPriority;


int __android_log_write(int prio, const char *tag, const char *text);


int __android_log_print(int prio, const char *tag,  const char *fmt, ...)
#if defined(__GNUC__)
    __attribute__ ((format(printf, 3, 4)))
#endif
    ;


int __android_log_vprint(int prio, const char *tag,
                         const char *fmt, va_list ap);


void __android_log_assert(const char *cond, const char *tag,
     const char *fmt, ...)   

介紹一下設定輸出log資訊的步驟,然後我們就可以通過log去除錯jni程式碼了
1 新增ndk對log支援
若需要新增ndk對log的支援,只需要通過以下2步即可實現。
1.1修改Android.mk
如生成的庫檔案是“.so檔案”,則在Android.mk中新增如下內容:
LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
如生成的庫檔案是“.a檔案”,則在Android.mk中新增如下內容:
LOCAL_LDLIBS:=-llog

1.2 在.c或.cpp檔案中引用log標頭檔案
新增如下內容:
// 引入log標頭檔案
#include  
// log標籤
#define TAG   "hello_load"
// 定義info資訊
#define LOGI(...)__android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
// 定義debug資訊
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG,__VA_ARGS__)
// 定義error資訊
#define LOGE(...)__android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)

ANDROID_LOG_INFO:是日誌級別;
TAG:是要過濾的標籤,可以在LogCat檢視中過濾。
__VA_ARGS__:是實際的日誌內容。
完成上面2步之後,我們就可以在.c/cpp檔案中新增LOGI、LOGD、LOGE去列印資訊!使用LOGI、LOGD、LOGE的方法和使用printf一樣

1.3日誌型別
1)Log.v 的除錯顏色為黑色的,任何訊息都會輸出,這裡的v代表verbose囉嗦的意思,平時使用就是Log.v(,);
2)Log.d的輸出顏色是藍色的,僅輸出debug除錯的意思,但他會輸出上層的資訊,過濾起來可以通過DDMS的Logcat標籤來選擇
3)Log.i的輸出為綠色,一般提示性的訊息information,它不會輸出Log.v和Log.d的資訊,但會顯示i、w和e的資訊
4)Log.w的意思為橙色,可以看作為warning警告,一般需要我們注意優化Android程式碼,同時選擇它後還會輸出Log.e的資訊。
5)Log.e為紅色,可以想到error錯誤,這裡僅顯示紅色的錯誤資訊,這些錯誤就需要我們認真的分析,檢視棧的資訊了。



相關推薦

tomcat日誌輸出的位置

遇到的問題是這樣的,使用tomcat的startup.sh啟動之後,在logs下的catalina.out檔案中總是沒有輸出日誌,所以就開始了這次查詢的旅程, 首先肯定要找startup.sh的指令碼了,如圖: 我沒學過shell,所以那麼多爛七八糟的也不太懂啦,但是我能

jni日誌輸出LOGCAT

在Java環境下使用JNI時可以方便的使用printf函式列印資訊,在Eclipse控制檯Console檢視可以方便的觀察到,可在Android環境下使用JNI的話,printf函式就無效了,LogCat檢視和Console視圖裡看不到任何輸出.但在android程式設計j

android studio jni底層日誌的打印

添加 註意 erro ldl end 1.0 dto 字符 ati 1 添加ndk對log支持若需要添加ndk對log的支持,只需要通過以下2步即可實現。 1.1 修改Android.mk如生成的庫文件是“.so文件”,則在Android.mk中添加如下內容:LOCAL_L

JAVA使用log4j及slf4j進行日誌輸出的方法

cto 所在 inf 官方 pat etl 註意 actor 結果   JAVA中輸出日誌比較常用的是log4j,這裏講下log4j的配置和使用方法,以及slf4j的使用。 一、下載log4j的架包,並導入項目中,如下: 二、創建log4j.prope

C#使用log4net框架做日誌輸出

repos com cep man utf info epo fin code 一、用法 1、引入包:https://www.nuget.org/packages/log4net/ 2、Main函數 using System; using System.IO;

Django 使用 logging 配置 logger 自定義日誌輸出

講解 handler ati dmi ase set file 過程 require 在使用 django 開發過程中,默認的日誌輸出是不能滿足我們去排查問題的,往往需要自定義的日誌輸出,幫助我們去排查程序BUG,定位問題原因。 在使用 django 的開發過程中,我使用的

scrapy螢幕log日誌輸出儲存到txt文字

在使用scrapy框架的時候,因為scrapy在螢幕上面輸出的日誌一直在跑,有些錯誤又抓不到,無奈只能先把log日誌放在檔案中,慢慢進行錯誤日誌的分析。 如圖所示: 我們需要設定的地方只在settings.py資料夾中進行設定就可以了。 LOG_LEVEL = 'DE

adb命令列輸出logcat日誌

輸出到終端: adb logcat 輸出到指定檔案:如log.txt adb logcat > log.txt 輸出到指定檔案並帶上日誌產生時的系統時間(個人感覺實用的): adb logcat -v time > log.txt

Spring Boot實現logback多環境日誌配置(日誌輸出)

  Spring Boot中實現logback多環境日誌配置 - EasonJim - 部落格園 https://www.cnblogs.com/EasonJim/p/7801549.html   Spring Boot中實現logback多環境日誌配置 方法

log4j2配置檔案,關於日誌輸出設定

<?xml version="1.0" encoding="UTF-8"?> <!--     status : 這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,會看到log4j2內部各種詳細輸出     monitorInte

專案日誌級別設定為INFO,控制檯一致輸出DEBUG

昨天專案中需要引入一個其他系統的功能,在直接把對方pom引入後,重新啟動專案後,控制檯輸出大量Zookeeper和Spring的DEBUG日誌;首先,將log4j從引入的專案中排除掉,重啟專案,依然刷了很多的DEBUG日誌;再去檢查,發現引入的這個包裡面包含自己的log4j.

slf4j配合log4j在系統增加新的日誌輸出檔案

對於每個程式設計師來說日誌資訊都是至關重要的,日誌資訊越完整越有助於我們排查問題。但是日誌過多時在檢視指定資訊時會有些不方便。此時我們可以把比較重要的日誌或特定業務的日誌輸入到指定的檔案中,便於我們查詢。在不修改原程式日誌的基礎上增加新的日誌輸出。在原環境可用的情況下直接新增

django使用日誌輸出

django中日誌和國際化都是採用彼python的標準庫來實現的,其中國際化是使用的GNU的gettext模組,日誌採用的是logging模組。logging模組在日誌方面是非常的強悍啊。 django的標準配置中有一個LOGGING的引數,但是並沒有任何實現,在djang

如何在 Spring Security 2 開啟日誌輸出

用了一陣子SS2,執行過程中一直沒有日誌輸出,從網上也找不到相應的內容, 回過頭來仔細研究提供的例子,發現他就能輸出日誌,仔細研究後發現,主要區別就在 缺少commons-logging-1.1.1.jar包 可能spring security 2並不使用log4j進行log

SMALI注入新增除錯日誌輸出

針對Android中Smali程式碼逆向分析,由於現在除錯技術有限,一種相對簡單的辦法是在Smali中加入Log輸出: const-string v3, "a"   invoke-static {v3, v2}, Landroid/util/Log;->v(Lj

iOS 將Log日誌輸出到檔案儲存

對於那些做後端開發的工程師來說,看LOG解Bug應該是理所當然的事,但我接觸到的移動應用開發的工程師裡面,很多人並沒有這個意識,查Bug時總是一遍一遍的試圖重現,試圖除錯,特別是對一些不太容易重現的Bug經常焦頭爛額。而且iOS的異常機制比較複雜,Objecti

用log4j如何使不同的類的日誌輸出到不同的日誌檔案.

1.先看log4j的配置檔案: log4j.rootLogger=INFO,R,Client log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=./log/server.lo

《flask日誌logging二》在flask使用日誌輸出

flask中app.logger是標準logging Logger。        例項:        app.logger.info('!!!!!!!!!!!!!!!!!!!!!!!!')     app.logger.debug('@@@@@@@@@@@@@@')

python logging模組程式碼示例:實現日誌輸出到控制檯, 並且寫入日誌檔案

import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name):

log4j詳解 將指定日誌輸出到不同的檔案

import org.apache.log4j.Logger; <span style="font-family: Arial, Helvetica, sans-serif;">public class HelloWorld {</span> <span style="whit