本文整理汇总了C++中LOGD函数的典型用法代码示例。如果您正苦于以下问题:C++ LOGD函数的具体用法?C++ LOGD怎么用?C++ LOGD使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LOGD函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(int argc, char **argv)
{
const char * rilLibPath = NULL;
char **rilArgv;
void *dlHandle;
const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
const RIL_RadioFunctions *funcs;
char libPath[PROPERTY_VALUE_MAX];
unsigned char hasLibArgs = 0;
int i;
umask(S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);
for (i = 1; i < argc ;) {
if (0 == strcmp(argv[i], "-l") && (argc - i > 1)) {
rilLibPath = argv[i + 1];
i += 2;
} else if (0 == strcmp(argv[i], "--")) {
i++;
hasLibArgs = 1;
break;
} else {
usage(argv[0]);
}
}
if (rilLibPath == NULL) {
if ( 0 == property_get(LIB_PATH_PROPERTY, libPath, NULL)) {
// No lib sepcified on the command line, and nothing set in props.
// Assume "no-ril" case.
goto done;
} else {
rilLibPath = libPath;
}
}
/* special override when in the emulator */
#if 1
{
static char* arg_overrides[3];
static char arg_device[32];
int done = 0;
#define REFERENCE_RIL_PATH "/system/lib/libreference-ril.so"
/* first, read /proc/cmdline into memory */
char buffer[1024], *p, *q;
int len;
int fd = open("/proc/cmdline",O_RDONLY);
if (fd < 0) {
LOGD("could not open /proc/cmdline:%s", strerror(errno));
goto OpenLib;
}
do {
len = read(fd,buffer,sizeof(buffer)); }
while (len == -1 && errno == EINTR);
if (len < 0) {
LOGD("could not read /proc/cmdline:%s", strerror(errno));
close(fd);
goto OpenLib;
}
close(fd);
if (strstr(buffer, "android.qemud=") != NULL)
{
/* the qemud daemon is launched after rild, so
* give it some time to create its GSM socket
*/
int tries = 5;
#define QEMUD_SOCKET_NAME "qemud"
while (1) {
int fd;
sleep(1);
fd = socket_local_client(
QEMUD_SOCKET_NAME,
ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM );
if (fd >= 0) {
close(fd);
snprintf( arg_device, sizeof(arg_device), "%s/%s",
ANDROID_SOCKET_DIR, QEMUD_SOCKET_NAME );
arg_overrides[1] = "-s";
arg_overrides[2] = arg_device;
done = 1;
break;
}
LOGD("could not connect to %s socket: %s",
QEMUD_SOCKET_NAME, strerror(errno));
if (--tries == 0)
break;
}
if (!done) {
//.........这里部分代码省略.........
示例2: switch
//.........这里部分代码省略.........
{
for (int z = 0; z < 2; ++z)
{
CanSpawn = a_Chunk->UnboundedRelGetBlockType(a_RelX + x, a_RelY, a_RelZ + z, TargetBlock);
CanSpawn = CanSpawn && (TargetBlock == E_BLOCK_AIR);
if (!CanSpawn)
{
return false;
}
HasFloor = (
HasFloor ||
(
a_Chunk->UnboundedRelGetBlockType(a_RelX + x, a_RelY - 1, a_RelZ + z, TargetBlock) &&
!cBlockInfo::IsTransparent(TargetBlock)
)
);
}
}
return CanSpawn && HasFloor && (SkyLight <= 7) && (BlockLight <= 7);
}
case mtCreeper:
case mtSkeleton:
case mtZombie:
{
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(!cBlockInfo::IsTransparent(BlockBelow)) &&
(SkyLight <= 7) &&
(BlockLight <= 7) &&
(Random.NextInt(2, a_Biome) == 0)
);
}
case mtMagmaCube:
case mtSlime:
{
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(!cBlockInfo::IsTransparent(BlockBelow)) &&
(
(a_RelY <= 40) || (a_Biome == biSwampland)
)
);
}
case mtGhast:
case mtZombiePigman:
{
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(!cBlockInfo::IsTransparent(BlockBelow)) &&
(Random.NextInt(20, a_Biome) == 0)
);
}
case mtWolf:
{
return (
(TargetBlock == E_BLOCK_GRASS) &&
(BlockAbove == E_BLOCK_AIR) &&
(
(a_Biome == biTaiga) ||
(a_Biome == biTaigaHills) ||
(a_Biome == biForest) ||
(a_Biome == biForestHills) ||
(a_Biome == biColdTaiga) ||
(a_Biome == biColdTaigaHills) ||
(a_Biome == biTaigaM) ||
(a_Biome == biMegaTaiga) ||
(a_Biome == biMegaTaigaHills)
)
);
}
case mtMooshroom:
{
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(BlockBelow == E_BLOCK_MYCELIUM) &&
(
(a_Biome == biMushroomShore) ||
(a_Biome == biMushroomIsland)
)
);
}
default:
{
LOGD("MG TODO: Write spawning rule for mob type %d", a_MobType);
return false;
}
}
}
return false;
}
示例3: zipalign
int zipalign(const char *apk_path, uid_t uid, int is_public)
{
char za_path[PKG_PATH_MAX];
struct utimbuf ut;
struct stat za_stat, apk_stat;
int res;
pid_t pid;
pid = fork();
if (pid == 0) {
run_check_zipalign(apk_path);
exit(67);
} else {
res = wait_check_zipalign(pid, apk_path);
if (res == 0) {
goto notneeded;
}
}
memset(&apk_stat, 0, sizeof(apk_stat));
stat(apk_path, &apk_stat);
strcpy(za_path, apk_path);
strcat(za_path, ".tmp");
LOGD("ZipAlign: --- BEGIN '%s' ---\n", apk_path);
pid = fork();
if (pid == 0) {
run_zipalign(apk_path, za_path);
exit(67);
} else {
res = wait_zipalign(pid, za_path);
if (res != 0) {
LOGE("zipalign failed on '%s' res = %d\n", za_path, res);
goto fail;
}
}
if (chown(za_path, apk_stat.st_uid, apk_stat.st_gid) < 0) {
LOGE("zipalign cannot chown '%s'", apk_path);
goto fail;
}
if (chmod(za_path, S_IRUSR|S_IWUSR|S_IRGRP |
(is_public ? S_IROTH : 0)) < 0) {
LOGE("zipalign cannot chmod '%s'\n", apk_path);
goto fail;
}
ut.actime = apk_stat.st_atime;
ut.modtime = apk_stat.st_mtime;
utime(za_path, &ut);
unlink(apk_path);
rename(za_path, apk_path);
return 0;
notneeded:
return 0;
fail:
unlink(za_path);
return -1;
}
示例4: LOGD
bool
HwcComposer2D::TryHwComposition()
{
FramebufferSurface* fbsurface = (FramebufferSurface*)(GetGonkDisplay()->GetFBSurface());
if (!(fbsurface && fbsurface->lastHandle)) {
LOGD("H/W Composition failed. FBSurface not initialized.");
return false;
}
// Add FB layer
int idx = mList->numHwLayers++;
if (idx >= mMaxLayerCount) {
if (!ReallocLayerList() || idx >= mMaxLayerCount) {
LOGE("TryHwComposition failed! Could not add FB layer");
return false;
}
}
Prepare(fbsurface->lastHandle, -1);
/* Possible composition paths, after hwc prepare:
1. GPU Composition
2. BLIT Composition
3. Full OVERLAY Composition
4. Partial OVERLAY Composition (GPU + OVERLAY) */
bool gpuComposite = false;
bool blitComposite = false;
bool overlayComposite = true;
for (int j=0; j < idx; j++) {
if (mList->hwLayers[j].compositionType == HWC_FRAMEBUFFER ||
mList->hwLayers[j].compositionType == HWC_BLIT) {
// Full OVERLAY composition is not possible on this frame
// It is either GPU / BLIT / partial OVERLAY composition.
overlayComposite = false;
break;
}
}
if (!overlayComposite) {
for (int k=0; k < idx; k++) {
switch (mList->hwLayers[k].compositionType) {
case HWC_FRAMEBUFFER:
gpuComposite = true;
break;
case HWC_BLIT:
blitComposite = true;
break;
case HWC_OVERLAY:
// HWC will compose HWC_OVERLAY layers in partial
// Overlay Composition, set layer composition flag
// on mapped LayerComposite to skip GPU composition
mHwcLayerMap[k]->SetLayerComposited(true);
if ((mList->hwLayers[k].hints & HWC_HINT_CLEAR_FB) &&
(mList->hwLayers[k].blending == HWC_BLENDING_NONE)) {
// Clear visible rect on FB with transparent pixels.
hwc_rect_t r = mList->hwLayers[k].displayFrame;
mHwcLayerMap[k]->SetClearRect(nsIntRect(r.left, r.top,
r.right - r.left,
r.bottom - r.top));
}
break;
default:
break;
}
}
if (gpuComposite) {
// GPU or partial OVERLAY Composition
return false;
} else if (blitComposite) {
// Some EGLSurface implementations require glClear() on blit composition.
// See bug 1029856.
if (mGLContext) {
mGLContext->MakeCurrent();
mGLContext->fClearColor(0.0, 0.0, 0.0, 0.0);
mGLContext->fClear(LOCAL_GL_COLOR_BUFFER_BIT);
}
// BLIT Composition, flip FB target
GetGonkDisplay()->UpdateFBSurface(mDpy, mSur);
FramebufferSurface* fbsurface = (FramebufferSurface*)(GetGonkDisplay()->GetFBSurface());
if (!fbsurface) {
LOGE("H/W Composition failed. NULL FBSurface.");
return false;
}
mList->hwLayers[idx].handle = fbsurface->lastHandle;
mList->hwLayers[idx].acquireFenceFd = fbsurface->GetPrevFBAcquireFd();
}
}
// BLIT or full OVERLAY Composition
Commit();
GetGonkDisplay()->SetFBReleaseFd(mList->hwLayers[idx].releaseFenceFd);
mList->hwLayers[idx].releaseFenceFd = -1;
return true;
}
示例5: client_connection
static bool client_connection(int fd)
{
bool ret = true;
auto fail = util::finally([&] {
if (!ret) {
LOGE("Killing connection");
}
});
LOGD("Accepted connection from %d", fd);
struct ucred cred;
socklen_t cred_len = sizeof(struct ucred);
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) < 0) {
LOGE("Failed to get socket credentials: %s", strerror(errno));
return ret = false;
}
LOGD("Client PID: %u", cred.pid);
LOGD("Client UID: %u", cred.uid);
LOGD("Client GID: %u", cred.gid);
if (verify_credentials(cred.uid)) {
if (!util::socket_write_string(fd, RESPONSE_ALLOW)) {
LOGE("Failed to send credentials allowed message");
return ret = false;
}
} else {
if (!util::socket_write_string(fd, RESPONSE_DENY)) {
LOGE("Failed to send credentials denied message");
}
return ret = false;
}
int32_t version;
if (!util::socket_read_int32(fd, &version)) {
LOGE("Failed to get interface version");
return ret = false;
}
if (version == 2) {
LOGE("Protocol version 2 is no longer supported");
util::socket_write_string(fd, RESPONSE_UNSUPPORTED);
return ret = false;
} else if (version == 3) {
if (!util::socket_write_string(fd, RESPONSE_OK)) {
return false;
}
if (!connection_version_3(fd)) {
LOGE("[Version 3] Communication error");
}
return true;
} else {
LOGE("Unsupported interface version: %d", version);
util::socket_write_string(fd, RESPONSE_UNSUPPORTED);
return ret = false;
}
return true;
}
示例6: replace_method
static void replace_method (Package *pkg) {
xmono::ReplaceMethodReq req;
xmono::ReplaceMethodRsp rsp;
std::string str((char*)pkg->body, pkg->all_len - sizeof (Package));
if (!req.ParseFromString (str)) {
LOGD ("xmono::ReplaceMethodReq ParseFromString err!");
return;
}
std::string err;
void *p, *old_p;
uint8_t *code;
int code_size;
MonoMethodHeader *mh;
MonoThread *thread;
MonoMethod *new_method;
MonoDomain *domain;
MonoMethod * method = get_method_with_token (req.image_name ().c_str (), req.method_token ());
if (!method) {
rsp.set_err (false);
rsp.set_msg (helper_last_err ());
goto replace_method_end;
}
domain = mono_domain_get_by_id (req.domain_id ());
if (!domain) {
rsp.set_err (false);
rsp.set_msg ("can not get the domain from id");
goto replace_method_end;
}
mh = mono_method_get_header (method);
if (req.ex_size () != mono_method_header_get_num_clauses (mh)) {
rsp.set_err (false);
rsp.set_msg ("ex size != mono_method_header_clauses size!");
goto replace_method_end;
}
for (int i = 0; i < req.ex_size (); i++) {
xmono::ReplaceMethodReq_ExceptionClause const &e = req.ex (i);
void *iter = 0;
MonoExceptionClause *clauses = &mh->clauses[i];
MonoExceptionClause *old_e = (MonoExceptionClause*)iter;
old_e->try_offset = e.try_offset ();
old_e->try_len = e.try_len ();
old_e->handler_offset = e.handler_offset ();
old_e->handler_len = e.handler_len ();
}
code = new uint8_t[req.new_code ().size ()];
memcpy (code, req.new_code ().c_str (), req.new_code ().size ());
mh->code = code;
mh->code_size = req.new_code ().size ();
thread = mono_thread_attach (domain);
/*128 是一个估计值, 在未来可能不稳定, 但当前只能如此*/
new_method = (MonoMethod*)calloc (128, 1); /*这个地方用malloc优于用new*/
memcpy (new_method, method, 128);
pthread_mutex_lock (&replace_mutex);
replace_method_dict[new_method] = true;
pthread_mutex_unlock (&replace_mutex);
p = mono_compile_method (new_method);
memcpy (hooked_method_dict[method]->specific_hook + 4, &p, 4);
pthread_mutex_lock (&hooked_mutex);
old_p = mono_jit_info_get_code_start (hooked_method_dict[method]->jinfo);
pthread_mutex_unlock (&hooked_mutex);
mono_thread_detach (thread);
LOGD ("compile method, new ptr : %p, old ptr : %p", p, old_p);
rsp.set_err (true);
rsp.set_msg ("replace_method successful.");
replace_method_end:
std::string out;
rsp.SerializeToString (&out);
ecmd_send (XMONO_ID_REPLACE_METHOD_RSP, (uint8_t const*)out.c_str (), out.size ());
return;
}
示例7: so_main
extern "C" int so_main() {
LOGD ("hello, xmono");
install_jit_profile ();
init_network ();
return 0;
}
示例8: LOGD
Application::~Application()
{
LOGD("Application::Destructor()");
destroy();
}
示例9: jsScope
//.........这里部分代码省略.........
break;
}
} else if (jsValue.isArray()) {
auto len = jsValue.getLength();
switch (_key) {
case StyleParamKey::extrude: {
if (len != 2) {
LOGW("Wrong array size for extrusion: '%d'.", len);
break;
}
double v1 = jsValue.getValueAtIndex(0).toDouble();
double v2 = jsValue.getValueAtIndex(1).toDouble();
_val = glm::vec2(v1, v2);
break;
}
case StyleParamKey::color:
case StyleParamKey::outline_color:
case StyleParamKey::text_font_fill:
case StyleParamKey::text_font_stroke_color: {
if (len < 3 || len > 4) {
LOGW("Wrong array size for color: '%d'.", len);
break;
}
double r = jsValue.getValueAtIndex(0).toDouble();
double g = jsValue.getValueAtIndex(1).toDouble();
double b = jsValue.getValueAtIndex(2).toDouble();
double a = 1.0;
if (len == 4) {
a = jsValue.getValueAtIndex(3).toDouble();
}
_val = ColorF(r, g, b, a).toColor().abgr;
break;
}
default:
break;
}
} else if (jsValue.isNumber()) {
double number = jsValue.toDouble();
if (std::isnan(number)) {
LOGD("duk evaluates JS method to NAN.\n");
}
switch (_key) {
case StyleParamKey::text_source:
case StyleParamKey::text_source_left:
case StyleParamKey::text_source_right:
_val = doubleToString(number);
break;
case StyleParamKey::extrude:
_val = glm::vec2(0.f, number);
break;
case StyleParamKey::placement_spacing: {
_val = StyleParam::Width{static_cast<float>(number), Unit::pixel};
break;
}
case StyleParamKey::width:
case StyleParamKey::outline_width: {
// TODO more efficient way to return pixels.
// atm this only works by return value as string
_val = StyleParam::Width{static_cast<float>(number)};
break;
}
case StyleParamKey::angle:
case StyleParamKey::priority:
case StyleParamKey::text_priority:
case StyleParamKey::text_font_stroke_width:
case StyleParamKey::placement_min_length_ratio: {
_val = static_cast<float>(number);
break;
}
case StyleParamKey::size: {
StyleParam::SizeValue vec;
vec.x.value = static_cast<float>(number);
_val = vec;
break;
}
case StyleParamKey::order:
case StyleParamKey::outline_order:
case StyleParamKey::color:
case StyleParamKey::outline_color:
case StyleParamKey::text_font_fill:
case StyleParamKey::text_font_stroke_color: {
_val = static_cast<uint32_t>(number);
break;
}
default:
break;
}
} else if (jsValue.isUndefined()) {
// Explicitly set value as 'undefined'. This is important for some styling rules.
_val = Undefined();
} else {
LOGW("Unhandled return type from Javascript style function for %d.", _key);
}
return !_val.is<none_type>();
}
示例10: dvmAbstractMethodStub
/*
* Magic "internal native" code stub, inserted into abstract method
* definitions when a class is first loaded. This throws the expected
* exception so we don't have to explicitly check for it in the interpreter.
*/
void dvmAbstractMethodStub(const u4* args, JValue* pResult)
{
LOGD("--- called into dvmAbstractMethodStub\n");
dvmThrowException("Ljava/lang/AbstractMethodError;",
"abstract method not implemented");
}
示例11: AT_DUMP
void AT_DUMP(const char* prefix, const char* buff, int len)
{
if (len < 0)
len = strlen(buff);
LOGD("%.*s", len, buff);
}
示例12: while
static const char *readline()
{
ssize_t count;
char *p_read = NULL;
char *p_eol = NULL;
char *ret;
/* this is a little odd. I use *s_ATBufferCur == 0 to
* mean "buffer consumed completely". If it points to a character, than
* the buffer continues until a \0
*/
if (*s_ATBufferCur == '\0') {
/* empty buffer */
s_ATBufferCur = s_ATBuffer;
*s_ATBufferCur = '\0';
p_read = s_ATBuffer;
} else { /* *s_ATBufferCur != '\0' */
/* there's data in the buffer from the last read */
// skip over leading newlines
while (*s_ATBufferCur == '\r' || *s_ATBufferCur == '\n')
s_ATBufferCur++;
p_eol = findNextEOL(s_ATBufferCur);
if (p_eol == NULL) {
/* a partial line. move it up and prepare to read more */
size_t len;
len = strlen(s_ATBufferCur);
memmove(s_ATBuffer, s_ATBufferCur, len + 1);
p_read = s_ATBuffer + len;
s_ATBufferCur = s_ATBuffer;
}
/* Otherwise, (p_eol !- NULL) there is a complete line */
/* that will be returned the while () loop below */
}
while (p_eol == NULL) {
if (0 == MAX_AT_RESPONSE - (p_read - s_ATBuffer)) {
LOGE("ERROR: Input line exceeded buffer\n");
/* ditch buffer and start over again */
s_ATBufferCur = s_ATBuffer;
*s_ATBufferCur = '\0';
p_read = s_ATBuffer;
}
do {
count = read(s_fd, p_read,
MAX_AT_RESPONSE - (p_read - s_ATBuffer));
} while (count < 0 && errno == EINTR);
if (count > 0) {
AT_DUMP( "<< ", p_read, count );
s_readCount += count;
p_read[count] = '\0';
// skip over leading newlines
while (*s_ATBufferCur == '\r' || *s_ATBufferCur == '\n')
s_ATBufferCur++;
p_eol = findNextEOL(s_ATBufferCur);
p_read += count;
} else if (count <= 0) {
/* read error encountered or EOF reached */
if(count == 0) {
LOGD("atchannel: EOF reached");
} else {
LOGD("atchannel: read error %s", strerror(errno));
}
return NULL;
}
}
/* a full line in the buffer. Place a \0 over the \r and return */
ret = s_ATBufferCur;
*p_eol = '\0';
s_ATBufferCur = p_eol + 1; /* this will always be <= p_read, */
/* and there will be a \0 at *p_read */
LOGD("AT< %s\n", ret);
return ret;
}
示例13: predict
int predict(float **values, int **indices, int rowNum, int colNum, int isProb,
const char *modelFile, int *labels, double* prob_estimates) {
LOGD("Coming into classification\n");
return svmpredict(values, indices, rowNum, colNum, isProb, modelFile, labels, prob_estimates);
}
示例14: defaultEGLChooser
bool defaultEGLChooser(EGLDisplay disp, EGLConfig& bestConfig)
{
EGLint count = 0;
if (!eglGetConfigs(disp, NULL, 0, &count))
{
LOGE("defaultEGLChooser cannot query count of all configs");
return false;
}
LOGD("Config count = %d", count);
EGLConfig* configs = new EGLConfig[count];
if (!eglGetConfigs(disp, configs, count, &count))
{
LOGE("defaultEGLChooser cannot query all configs");
return false;
}
int bestMatch = 1<<30;
int bestIndex = -1;
int i;
for (i = 0; i < count; i++)
{
int match = 0;
EGLint surfaceType = 0;
EGLint blueBits = 0;
EGLint greenBits = 0;
EGLint redBits = 0;
EGLint alphaBits = 0;
EGLint depthBits = 0;
EGLint stencilBits = 0;
EGLint renderableFlags = 0;
eglGetConfigAttrib(disp, configs[i], EGL_SURFACE_TYPE, &surfaceType);
eglGetConfigAttrib(disp, configs[i], EGL_BLUE_SIZE, &blueBits);
eglGetConfigAttrib(disp, configs[i], EGL_GREEN_SIZE, &greenBits);
eglGetConfigAttrib(disp, configs[i], EGL_RED_SIZE, &redBits);
eglGetConfigAttrib(disp, configs[i], EGL_ALPHA_SIZE, &alphaBits);
eglGetConfigAttrib(disp, configs[i], EGL_DEPTH_SIZE, &depthBits);
eglGetConfigAttrib(disp, configs[i], EGL_STENCIL_SIZE, &stencilBits);
eglGetConfigAttrib(disp, configs[i], EGL_RENDERABLE_TYPE, &renderableFlags);
LOGD("Config[%d]: R%dG%dB%dA%d D%dS%d Type=%04x Render=%04x",
i, redBits, greenBits, blueBits, alphaBits, depthBits, stencilBits, surfaceType, renderableFlags);
if ((surfaceType & EGL_WINDOW_BIT) == 0)
continue;
if ((renderableFlags & EGL_OPENGL_ES2_BIT) == 0)
continue;
if (depthBits < 16)
continue;
if ((redBits < 5) || (greenBits < 6) || (blueBits < 5))
continue;
int penalty = depthBits - 16;
match += penalty * penalty;
penalty = redBits - 5;
match += penalty * penalty;
penalty = greenBits - 6;
match += penalty * penalty;
penalty = blueBits - 5;
match += penalty * penalty;
penalty = alphaBits;
match += penalty * penalty;
penalty = stencilBits;
match += penalty * penalty;
if ((match < bestMatch) || (bestIndex == -1))
{
bestMatch = match;
bestIndex = i;
LOGD("Config[%d] is the new best config", i, configs[i]);
}
}
if (bestIndex < 0)
{
delete[] configs;
return false;
}
bestConfig = configs[bestIndex];
delete[] configs;
return true;
}
示例15: mono_shutdown
/*mono正常退出时 该函数被调用*/
static void mono_shutdown (MonoProfiler *prof) {
LOGD ("mono over.");
}