14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** Log wrapper for Android.
24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{
34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file
44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Maps LOG_*() macros to __android_log_print() if LOG_ANDROID is defined.
64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Adds some extra info to log output like LOG_TAG, file name and line number.
74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
84e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2010 - 2011 -->
94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without
114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions
124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met:
134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright
144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    notice, this list of conditions and the following disclaimer.
154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright
164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    notice, this list of conditions and the following disclaimer in the
174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    documentation and/or other materials provided with the distribution.
184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote
194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    products derived from this software without specific prior
204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    written permission.
214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */
344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#ifndef TLCWRAPPERANDROIDLOG_H_
354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define TLCWRAPPERANDROIDLOG_H_
364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <unistd.h>
384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <stdio.h>
394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <android/log.h>
404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
419081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim/** LOG_I(fmt, args...)
429081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * Informative logging, only shown in debug version
439081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim */
449081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
459081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim/** LOG_W(fmt, args...)
469081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * Warnings logging, only shown in debug version
479081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim */
489081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
499081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim/** LOG_E(fmt, args...)
509081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * Error logging, shown in debug and release version
519081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim */
529081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
539081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim/** LOG_V(fmt, args...)
549081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * Verbose logging, shown in debug version if the including file defines LOG_VERBOSE
559081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim */
569081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
579081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim/** LOG_I_BUF(szDescriptor, blob, sizeOfBlob)
589081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim * Binary logging, line-wise output to LOG_I
599081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim */
604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define EOL "\n"
624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define DUMMY_FUNCTION()    do{}while(0)
634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#ifdef LOG_ANDROID
659081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim// log to adb logcat
669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#ifdef NDEBUG // no logging in debug version
674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_I(fmt, args...) DUMMY_FUNCTION()
684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_W(fmt, args...) DUMMY_FUNCTION()
694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#else
709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    // add LINE
719081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    #define LOG_I(fmt, args...) LOG_i(fmt";%d", ## args, __LINE__)
729081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    #define LOG_W(fmt, args...) LOG_w(fmt";%d", ## args, __LINE__)
734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif
749081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    // LOG_E is always defined
759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    #define _LOG_E(fmt, args...) LOG_e(fmt, ## args)
764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
779081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    // actually mapping to log system, adding level and tag.
784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_i(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_w(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_e(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#else //!defined(LOG_ANDROID)
839081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim// log to std.out using printf
844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    // #level / #LOG_TAG ( process_id): __VA_ARGS__
864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    // Example:
874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    // I/McDrvBasicTest_0_1( 4075): setUp
884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define _LOG_x(_x_,...) \
894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                do \
904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                { \
914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                    printf("%s/%s(%d): ",_x_,LOG_TAG,getpid()); \
924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                    printf(__VA_ARGS__); \
934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                    printf(EOL); \
944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park                } while(1!=1)
954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#ifdef NDEBUG // no logging in debug version
984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_I(fmt, args...) DUMMY_FUNCTION()
994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_W(fmt, args...) DUMMY_FUNCTION()
1004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#else
1014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_I(...)  _LOG_x("I",__VA_ARGS__)
1024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define LOG_W(...)  _LOG_x("W",__VA_ARGS__)
1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif
1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park    #define _LOG_E(...)  _LOG_x("E",__VA_ARGS__)
1054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif //defined(LOG_ANDROID)
1074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1089081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#if defined(LOG_VERBOSE)
1099081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#define LOG_V LOG_I
1109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#else
1119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#define LOG_V(...) DUMMY_FUNCTION()
1129081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#endif
1134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** LOG_E() needs to be more prominent:
1154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Display "*********** ERROR ***********" before actual error message.
1164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */
1174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define LOG_E(...) \
1184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park            do \
1194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park            { \
1209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim                _LOG_E("  *****************************"); \
1219081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim                _LOG_E("  *** ERROR: "__VA_ARGS__); \
1229081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim                _LOG_E("  *** Detected in %s:%i/%s()", __FILE__, __LINE__, __FUNCTION__); \
1239081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim                _LOG_E("  *****************************"); \
1244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park            } while(1!=1)
1254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1269081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#define LOG_ERRNO(MESSAGE) \
1279081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim    LOG_E("%s failed with \"%s\"(errno %i)", MESSAGE, strerror(errno), errno);
1284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define LOG_I_BUF   LOG_I_Buf
1304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park__attribute__ ((unused))
1324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkstatic void LOG_I_Buf(
1334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	const char *  szDescriptor,
1344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	const void *  blob,
1354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	size_t        sizeOfBlob
1364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) {
1374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	#define CPL         0x10  // chars per line
1394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	#define OVERHEAD    20
1404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	char buffer[CPL * 4 + OVERHEAD];
1424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t index = 0;
1444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t moreThanOneLine = (sizeOfBlob > CPL);
1464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t blockLen = CPL;
1474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t addr = 0;
1484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t i = 0;
1494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	if (NULL != szDescriptor)
1514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
1524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		index += sprintf(&buffer[index], "%s", szDescriptor);
1534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	}
1544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	if (moreThanOneLine)
1564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
1574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		if (NULL == szDescriptor)
1584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		{
1594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			index += sprintf(&buffer[index], "memory dump");
1604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		}
1614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		index += sprintf(&buffer[index], " (0x%08x, %d bytes)", (uint32_t)blob,sizeOfBlob);
1624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		LOG_I("%s", buffer);
1634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		index = 0;
1644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	}
1654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	else if (NULL == szDescriptor)
1664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
1674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		index += sprintf(&buffer[index], "Data at 0x%08x: ", (uint32_t)blob);
1684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	}
1694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	if(sizeOfBlob == 0) {
1714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		LOG_I("%s", buffer);
1724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	}
1734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	else
1744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
1754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		while (sizeOfBlob > 0)
1764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		{
1774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			if (sizeOfBlob < blockLen)
1784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			{
1794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				blockLen = sizeOfBlob;
1804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			}
1814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			// address
1834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			if (moreThanOneLine)
1844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			{
1854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				index += sprintf(&buffer[index], "0x%08X | ",addr);
1864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				addr += CPL;
1874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			}
1884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			// bytes as hex
1894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			for (i=0; i<blockLen; ++i)
1904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			{
1914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				index += sprintf(&buffer[index], "%02x ", ((const char *)blob)[i] );
1924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			}
1934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			// spaces if necessary
1944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			if ((blockLen < CPL) && (moreThanOneLine))
1954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			{
1964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				// add spaces
1974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				for (i=0; i<(3*(CPL-blockLen)); ++i) {
1984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				index += sprintf(&buffer[index], " ");
1994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				}
2004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			}
2014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			// bytes as ASCII
2024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			index += sprintf(&buffer[index], "| ");
2034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			for (i=0; i<blockLen; ++i)
2044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			{
2054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				char c = ((const char *)blob)[i];
2064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park				index += sprintf(&buffer[index], "%c",(c>32)?c:'.');
2074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			}
2084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			blob = &(((const char *)blob)[blockLen]);
2104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			sizeOfBlob -= blockLen;
2114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			// print line to logcat / stdout
2134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			LOG_I("%s", buffer);
2144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park			index = 0;
2154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park		}
2164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	}
2174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
2184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif /** TLCWRAPPERANDROIDLOG_H_ */
2204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */
222