android_database_SQLiteDebug.cpp revision c3849200fa60b22ea583ba2a6f902d6a632a5e7e
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 Projectnamespace android {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Noristatic jfieldID gMemoryUsedField;
35c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Noristatic jfieldID gPageCacheOverfloField;
36c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Noristatic jfieldID gLargestMemAllocField;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define USE_MSPACE 0
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void getPagerStats(JNIEnv *env, jobject clazz, jobject statsObj)
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
43c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    int memoryUsed;
44c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    int pageCacheOverflo;
45c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    int largestMemAlloc;
46c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    int unused;
47c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
48c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    sqlite3_status(SQLITE_STATUS_MEMORY_USED, &memoryUsed, &unused, 0);
49c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &unused, &largestMemAlloc, 0);
50c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflo, &unused, 0);
51c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    env->SetIntField(statsObj, gMemoryUsedField, memoryUsed);
52c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    env->SetIntField(statsObj, gPageCacheOverfloField, pageCacheOverflo);
53c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    env->SetIntField(statsObj, gLargestMemAllocField, largestMemAlloc);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapSize(JNIEnv *env, jobject clazz)
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = dlmallinfo();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.usmblks;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#elif USE_MSPACE
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mspace space = sqlite3_get_mspace();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (space != 0) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mspace_footprint(space);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapAllocatedSize(JNIEnv *env, jobject clazz)
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.uordblks;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sqlite3_memory_used();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getHeapFreeSize(JNIEnv *env, jobject clazz)
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !NO_MALLINFO
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong) info.fordblks;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getHeapSize(env, clazz) - sqlite3_memory_used();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int read_mapinfo(FILE *fp,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int *sharedPages, int *privatePages)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char line[1024];
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int skip;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned start = 0, size = 0, resident = 0;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned shared_clean = 0, shared_dirty = 0;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned private_clean = 0, private_dirty = 0;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned referenced = 0;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int isAnon = 0;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int isHeap = 0;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectagain:
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    skip = 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if(fgets(line, 1024, fp) == 0) return 0;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    len = strlen(line);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len < 1) return 0;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    line[--len] = 0;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* ignore guard pages */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (line[18] == '-') skip = 1;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    start = strtoul(line, 0, 16);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len > 50 && !strncmp(line + 49, "/tmp/sqlite-heap", strlen("/tmp/sqlite-heap"))) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isHeap = 1;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Size: %d kB", &size) != 1) return 0;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Rss: %d kB", &resident) != 1) return 0;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Shared_Clean: %d kB", &shared_clean) != 1) return 0;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Shared_Dirty: %d kB", &shared_dirty) != 1) return 0;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Private_Clean: %d kB", &private_clean) != 1) return 0;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Private_Dirty: %d kB", &private_dirty) != 1) return 0;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fgets(line, 1024, fp) == 0) return 0;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sscanf(line, "Referenced: %d kB", &referenced) != 1) return 0;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (skip) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto again;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (isHeap) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *sharedPages += shared_dirty;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *privatePages += private_dirty;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 1;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void load_maps(int pid, int *sharedPages, int *privatePages)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char tmp[128];
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FILE *fp;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sprintf(tmp, "/proc/%d/smaps", pid);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fp = fopen(tmp, "r");
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fp == 0) return;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (read_mapinfo(fp, sharedPages, privatePages) != 0) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do nothing
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fclose(fp);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void getHeapDirtyPages(JNIEnv *env, jobject clazz, jintArray pages)
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int _pages[2];
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[0] = 0;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[1] = 0;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    load_maps(getpid(), &_pages[0], &_pages[1]);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Convert from kbytes to 4K pages
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[0] /= 4;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _pages[1] /= 4;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntArrayRegion(pages, 0, 2, _pages);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getPagerStats", "(Landroid/database/sqlite/SQLiteDebug$PagerStats;)V",
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) getPagerStats },
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapSize", "()J", (void*) getHeapSize },
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapAllocatedSize", "()J", (void*) getHeapAllocatedSize },
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapFreeSize", "()J", (void*) getHeapFreeSize },
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getHeapDirtyPages", "([I)V", (void*) getHeapDirtyPages },
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_database_SQLiteDebug(JNIEnv *env)
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clazz = env->FindClass("android/database/sqlite/SQLiteDebug$PagerStats");
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == NULL) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Can't find android/database/sqlite/SQLiteDebug$PagerStats");
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
208c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    gMemoryUsedField = env->GetFieldID(clazz, "memoryUsed", "I");
209c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    if (gMemoryUsedField == NULL) {
210c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        LOGE("Can't find memoryUsed");
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
214c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    gLargestMemAllocField = env->GetFieldID(clazz, "largestMemAlloc", "I");
215c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    if (gLargestMemAllocField == NULL) {
216c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        LOGE("Can't find largestMemAlloc");
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    gPageCacheOverfloField = env->GetFieldID(clazz, "pageCacheOverflo", "I");
221c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    if (gPageCacheOverfloField == NULL) {
222c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        LOGE("Can't find pageCacheOverflo");
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return jniRegisterNativeMethods(env, "android/database/sqlite/SQLiteDebug",
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gMethods, NELEM(gMethods));
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android
231