SQLite Android Bindings

View Ticket
Login
Ticket Hash: 8d03600d81328b53c0505672313bebf61944d3b0
Title: suspected bug introduced in jni/android_database_SQLiteConnection.cpp
Status: Open Type: Code_Defect
Severity: Critical Priority:
Subsystem: Resolution:
Last Modified: 2014-06-11 19:48:52
Version Found In: trunk
User Comments:
anonymous added on 2014-06-11 19:48:52:
Hi, 

We've built and deployed this in an APK successfully, but the JNI code has a memory leak. We are using cursor.moveToNext() with row results of a few hundred and we quickly run into the following crash (because Android detects when more than 500-or so dangling memory references are still being held. 

I suspect the following commit is the culprit, since it specifically references changes to nativeExecuteForCursorWindow(), which is listed in the below stack trace from Android.

[365586dcaf] Replace nativeExecuteForCursorWindow() with an implementation that builds with the NDK. Seems to work, but is not yet tested. Exception handling is almost certainly still wrong. 
http://www.sqlite.org/android/info/365586dcafe43f880021b0de52b6a19f02fc6ee1

Would appreciate any comments you can provide. =)

E/dalvikvm( 8184): JNI ERROR (app bug): local reference table overflow (max=512)
W/dalvikvm( 8184): JNI local reference table (0x6287a000) dump:
W/dalvikvm( 8184): Last 10 entries (of 512):
W/dalvikvm( 8184): 511: 0x4198db00 java.lang.Class
W/dalvikvm( 8184): 510: 0x4243ccb0 java.lang.String "4704-6055f85cb8e... (37 chars)
W/dalvikvm( 8184): 509: 0x4243cc30 java.lang.String "4705-4257136a352... (37 chars)
W/dalvikvm( 8184): 508: 0x4243cbb0 java.lang.String "4706-10b6c6e3309... (37 chars)
W/dalvikvm( 8184): 507: 0x4243cb30 java.lang.String "4707-cf8761aaaa2... (37 chars)
W/dalvikvm( 8184): 506: 0x42435568 java.lang.String "4708-0eb255040b3... (37 chars)
W/dalvikvm( 8184): 505: 0x424354e8 java.lang.String "4709-5ab35850687... (37 chars)
W/dalvikvm( 8184): 504: 0x42435468 java.lang.String "4710-30c02305ef4... (37 chars)
W/dalvikvm( 8184): 503: 0x424353e8 java.lang.String "4711-aaeb683b34f... (37 chars)
W/dalvikvm( 8184): 502: 0x42435368 java.lang.String "4712-8568ce06955... (37 chars)
W/dalvikvm( 8184): Summary:
W/dalvikvm( 8184): 3 of java.lang.Class (2 unique instances)
W/dalvikvm( 8184): 508 of java.lang.String (508 unique instances)
W/dalvikvm( 8184): 1 of android.database.CursorWindow
E/dalvikvm( 8184): Failed adding to JNI local ref table (has 512 entries)
I/dalvikvm( 8184): "pool-1-thread-1" prio=5 tid=18 RUNNABLE
I/dalvikvm( 8184): | group="main" sCount=0 dsCount=0 obj=0x42606278 self=0x5b05c1c8
I/dalvikvm( 8184): | sysTid=8234 nice=0 sched=0/0 cgrp=apps handle=1636460376
I/dalvikvm( 8184): | state=R schedstat=( 0 0 0 ) utm=3605 stm=454 core=1
I/dalvikvm( 8184): at android.database.CursorWindow.nativePutString(Native Method)
I/dalvikvm( 8184): at android.database.CursorWindow.putString(CursorWindow.java:625)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:861)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:840)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:66)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:169)
I/dalvikvm( 8184): at org.sqlite.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:139)
I/dalvikvm( 8184): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
I/dalvikvm( 8184): at android.database.AbstractCursor.moveToNext(AbstractCursor.java:245)
I/dalvikvm( 8184): at com.couchbase.lite.android.AndroidSQLiteStorageEngine$SQLiteCursorWrapper.moveToNext(AndroidSQLiteStorageEngine.java:179)

Thank you!

- Michael R. Hines