Ответ Фобоса содержит некоторую относящуюся к делу информацию, но он не включает, как он относится к вашей проблеме или как решить вашу конкретную проблему. Я столкнулся с подобной проблемой, когда проводил некоторое тестирование производительности в javascript для Android, который обращается к java через объект, связанный с контекстом webview с помощью addJavascriptInterface. Хотя я явно не использую JNI, очевидно, что под прикрытием связанный интерфейс использует JNI для маршалинга данных - я получил ошибку и трассировку стека, аналогичную вашей. По-видимому, webDB или localStorage или все, что вы там делаете, также использует JNI под прикрытием.
Согласно информации, которую связал Фобос, существует ограниченное количество ссылок, которые вы можете иметь в области действия при использовании JNI. В случае javascript, который косвенно использует JNI, кажется, что ссылки должны храниться в зависимости от области видимости javascript. Глядя на ваш код, я не уверен, что именно вы делаете, чтобы превысить лимит, но похоже, что это может быть либо количество вызовов, которые вы делаете в транзакции в целом, либо ваши массивы значений в конечном итоге содержат более 512 элементов. Если вам нужно сохранить целостность транзакций и у вас действительно более 500 операций, вам может не повезти. Однако я подозреваю, что вы сможете найти способ обойти ограничение в 512, переписав свой код для создания строки запроса вне области вызова tx.executeSql
.
Может быть, вы могли бы переписать код для построения строк запроса, а затем фактически вызвать tx.executeSql
в оболочке анонимной функции? Возможно, вам нужно создавать строки, содержащие значения, а не использовать синтаксис 'INSERT INTO table() VALUES()',[]
... Как я уже говорил выше, если у вас более 500 операций в транзакции, вы все равно можете столкнуться с проблемами, но это стоит попробовать !
P.S. Для справки, вот версия моего кода, которая вылетала вместе с исправлением:
var test = function() {
var a = "a";
for(i=0;i<1000;i++) {
boundJavaObj.test(a);
}
}
test () вылетает с ошибкой типа:
03-28 10:57:45.634: W/dalvikvm(21294): ReferenceTable overflow (max=512)
var test2 = function() {
var a = "a";
for(i=0;i<1000;i++) {
(function(){boundJavaObj.test(a);})();
}
}
test2 () не дает сбоя.