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.


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