Android SDK/NDKのログ出力機能を使う

test112_01.png
Android SDK/NDKには開発者向けにログ出力機能が備わっている。今回はそれを試しに使ってみる。

test112_02.png
javaではandroid.util.LogをインポートすればLog.v()、Log.d()、Log.i()、Log.w()、Log.e()関数でログ出力できる。

Android SDK/NDKではリリースビルド/デバッグビルドという概念がない?ため、一般公開した後もログ出力機能が有効なままになってしまう。リリースビルド時などログ出力が不要なときに簡単に機能を削除できるように、LOCAL_LOGやLOCAL_LOGDを定義、それを使って手動制御した方がいい。
package com.Test112;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.util.Log;

public class Test112Act extends Activity
{
	//ログを出力するならtrue、出力しないならfalse
	//リリースビルドではfalseにする
	final boolean LOCAL_LOGD = true;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		TextView	tv = new TextView(this);
		tv.setText( stringFromJNI() );
		setContentView(tv);
		
		//5種類のログを出力
		if(LOCAL_LOGD)
		{
			Log.v("Tag","Test Message : Log.v() for VERBOSE");
			Log.d("Tag","Test Message : Log.d() for DEBUG");
			Log.i("Tag","Test Message : Log.i() for INFO");
			Log.w("Tag","Test Message : Log.w() for WARN");
			Log.e("Tag","Test Message : Log.e() for ERROR");
		}
	}

	public native String  stringFromJNI();

	static
	{
		System.loadLibrary("Test112jni");
	}
}

test112_03.png ネイティブコードでログ出力機能を利用する場合は、Android.mkで「LOCAL_LDLIBS」に「-llog」のリンク指定を追加する。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Test112jni
LOCAL_SRC_FILES := Test112jni.c
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

test112_04.png
実際の出力は__android_log_write()や__android_log_print()で行う。__android_log_write()は固定メッセージをログ出力、__android_log_print()はprintfのように書式化して出力できる。

ログの種別はANDROID_LOG_VERBOSE、ANDROID_LOG_DEBUG、ANDROID_LOG_INFO、ANDROID_LOG_WARN、ANDROID_LOG_ERROR、ANDROID_LOG_FATALなどの定数が利用できる。
//ログを出力する。ログ出力しないなら次の1行をコメントアウトすること
#define	LOCAL_LOG

#include <string.h>
#include <jni.h>

#ifdef	LOCAL_LOG
#include <android/log.h>
#endif

jstring
Java_com_Test112_Test112Act_stringFromJNI(JNIEnv* env,jobject thiz)
{
#ifdef	LOCAL_LOG
	//ログを出力
	__android_log_write(ANDROID_LOG_DEBUG,"Tag","Test Message : __android_log_write() with ANDROID_LOG_DEBUG");
	__android_log_print(ANDROID_LOG_DEBUG,"Tag","Test Message : __android_log_print(%s) with ANDROID_LOG_DEBUG","test string");

//	int	nTest = 123;
//	__android_log_assert("nTest == 123","Tag","Test Message : __android_log_assert(nTest == 123) with nTest=%d",nTest);
//	__android_log_assert("nTest != 123","Tag","Test Message : __android_log_assert(nTest != 123) with nTest=%d",nTest);
#endif

	return (*env)->NewStringUTF(env, "Test112text");
}

test112_05.png
ログ出力を実装して実行した。実行時の見た目は実装前と変わらない。

test112_06.png
出力されたログを見るには、Eclipseの「DDMS」画面の「LogCat」を利用する。

test112_07.png
ここにログ出力日時とログ出力関数を呼び出したときの引数が表示される。

test112_08.png
ログには種別があり、上部のボタンで表示レベルを切り換えれる。

VERBOSEでは全て表示、DEBUGではVERBOSE以外を表示、INFOではVERBOSEとDEBUG以外を表示、、、とV>D>I>W>Eの順番で表示されるログ種別が多い。

test112_09.png
フィルター機能も備え、タグなどを指定して絞り込み表示できる。

test112_10.png
絞り込みタブを削除するには「Delete Filter」ボタンを使う




プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー