android_database_SQLiteDebug.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <JNIHelp.h>
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/mspace.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sqlite3.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// From mem_mspace.c in libsqlite
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" mspace sqlite3_get_mspace();
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// From sqlite.c, hacked in for Android
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" void sqlite3_get_pager_stats(sqlite3_int64 * totalBytesOut,
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       sqlite3_int64 * referencedBytesOut,
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       sqlite3_int64 * dbBytesOut,
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       int * numPagersOut);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gTotalBytesField;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gReferencedBytesField;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gDbBytesField;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gNumPagersField;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define USE_MSPACE 0
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void getPagerStats(JNIEnv *env, jobject clazz, jobject statsObj)
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sqlite3_int64 totalBytes;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sqlite3_int64 referencedBytes;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sqlite3_int64 dbBytes;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numPagers;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sqlite3_get_pager_stats(&totalBytes, &referencedBytes, &dbBytes,
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            &numPagers);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetLongField(statsObj, gTotalBytesField, totalBytes);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetLongField(statsObj, gReferencedBytesField, referencedBytes);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetLongField(statsObj, gDbBytesField, dbBytes);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(statsObj, gNumPagersField, numPagers);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapSize(JNIEnv *env, jobject clazz)
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = dlmallinfo();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.usmblks;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif USE_MSPACE
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mspace space = sqlite3_get_mspace();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (space != 0) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mspace_footprint(space);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapAllocatedSize(JNIEnv *env, jobject clazz)
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.uordblks;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sqlite3_memory_used();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapFreeSize(JNIEnv *env, jobject clazz)
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.fordblks;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getHeapSize(env, clazz) - sqlite3_memory_used();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int read_mapinfo(FILE *fp,
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int *sharedPages, int *privatePages)
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char line[1024];
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int skip;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned start = 0, size = 0, resident = 0;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned shared_clean = 0, shared_dirty = 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned private_clean = 0, private_dirty = 0;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned referenced = 0;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int isAnon = 0;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int isHeap = 0;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectagain:
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    skip = 0;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(fgets(line, 1024, fp) == 0) return 0;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    len = strlen(line);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len < 1) return 0;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    line[--len] = 0;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* ignore guard pages */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (line[18] == '-') skip = 1;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    start = strtoul(line, 0, 16);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len > 50 && !strncmp(line + 49, "/tmp/sqlite-heap", strlen("/tmp/sqlite-heap"))) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isHeap = 1;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Size: %d kB", &size) != 1) return 0;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Rss: %d kB", &resident) != 1) return 0;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Shared_Clean: %d kB", &shared_clean) != 1) return 0;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Shared_Dirty: %d kB", &shared_dirty) != 1) return 0;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Private_Clean: %d kB", &private_clean) != 1) return 0;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Private_Dirty: %d kB", &private_dirty) != 1) return 0;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Referenced: %d kB", &referenced) != 1) return 0;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (skip) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto again;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (isHeap) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *sharedPages += shared_dirty;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *privatePages += private_dirty;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 1;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void load_maps(int pid, int *sharedPages, int *privatePages)
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char tmp[128];
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FILE *fp;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sprintf(tmp, "/proc/%d/smaps", pid);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fp = fopen(tmp, "r");
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fp == 0) return;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (read_mapinfo(fp, sharedPages, privatePages) != 0) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do nothing
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fclose(fp);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void getHeapDirtyPages(JNIEnv *env, jobject clazz, jintArray pages)
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int _pages[2];
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[0] = 0;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[1] = 0;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    load_maps(getpid(), &_pages[0], &_pages[1]);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Convert from kbytes to 4K pages
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[0] /= 4;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[1] /= 4;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntArrayRegion(pages, 0, 2, _pages);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getPagerStats", "(Landroid/database/sqlite/SQLiteDebug$PagerStats;)V",
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) getPagerStats },
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapSize", "()J", (void*) getHeapSize },
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapAllocatedSize", "()J", (void*) getHeapAllocatedSize },
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapFreeSize", "()J", (void*) getHeapFreeSize },
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapDirtyPages", "([I)V", (void*) getHeapDirtyPages },
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_database_SQLiteDebug(JNIEnv *env)
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clazz = env->FindClass("android/database/sqlite/SQLiteDebug$PagerStats");
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == NULL) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find android/database/sqlite/SQLiteDebug$PagerStats");
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTotalBytesField = env->GetFieldID(clazz, "totalBytes", "J");
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gTotalBytesField == NULL) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find totalBytes");
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gReferencedBytesField = env->GetFieldID(clazz, "referencedBytes", "J");
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gReferencedBytesField == NULL) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find referencedBytes");
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gDbBytesField = env->GetFieldID(clazz, "databaseBytes", "J");
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gDbBytesField == NULL) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find databaseBytes");
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gNumPagersField = env->GetFieldID(clazz, "numPagers", "I");
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gNumPagersField == NULL) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find numPagers");
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return jniRegisterNativeMethods(env, "android/database/sqlite/SQLiteDebug",
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gMethods, NELEM(gMethods));
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android
245