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