Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK學習筆記12-JNI日志打印

Android NDK學習筆記12-JNI日志打印

編輯:關於Android編程

在Java環境中我們使用JNI時可以使用printf函數打印,但是Android環境下使用JNI,printf函數就無效了,而我們使用IDE開發工具中的LogCat視圖以及Console視圖裡也沒有任何輸出。其實,Android NDK完全支持JNI本地日志調試。為了使用日志函數,我們可以按照如下步驟實現:

1.原生代碼需要先包含頭文件

#include

2.修改Android.mk文件,從而將原生模塊與日志庫進行鏈接,可以通過使用構建系統變量LOCAL_LDLIBS完成該操作

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS += -llog
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

3.在原生代碼中配置日志消息打印

通過日志API發送給logger模塊的每個日志條目都應該具有以下字段:
Priority:取值分別為verbose、debug、info、warning、error和fatal,表示信息的重要程度。

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;

Tag:標識產生日志信息的組件,Logcat和DDMS工具可以基於這個標簽值過濾日志信息。標簽值應盡可能小。
Message:用於存放實際日志信息。

4.常用日志函數

android/log.h頭文件也聲明了一系列函數,這些函數主要用於原生代碼生成日志消息。
● _android_log_write:可用於生成一個簡單的字符串作為日志信息

_android_log_write(ANDROID_LOG_WARN,"hello-jni","warning log.");

● _android_log_print:可以用於生成一個格式化字符串作為日志消息。

_android_log_print(ANDROID_LOG_ERROR,"hello-jni","Failed with errno%d",erron);

● _android_log_vprint:除了參數傳遞方式外,其他功能與_android_log_print完全相同,_android_log_vprint函數用va_list傳遞附加參數,而_android_log_print函數中已連續參數的方式改為傳遞參數。

va_list args;
va_start(args,format);
_android_log_vprint(ANDROID_LOG_VERBOSS,"hello-jni",format,args);

● _android_log_assert:用於記錄斷言失敗,它不包括日志優先級,將所有日志記錄為fatal

if(0 != erron){
_android_log_assert("0!=errno","hello-jni","There is an errno");
}

案例如下:
hello-jni.c文件

#include 
#include 
#include 

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    int var = 0;
    var = 1;
    __android_log_print(ANDROID_LOG_INFO,"HelloJni","LOVE LOG");
    __android_log_print(ANDROID_LOG_DEBUG,"HelloJni","var=%d",var);
    return (*env)->NewStringUTF(env, "I LOVE YOU UU!  Compiled with ABI " ABI ".");
}

android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS += -llog

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

重新編譯後,運行項目,我們可以看到如下日志打印:

JNI日志打印

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved