Skip to content

Commit 2862a81

Browse files
Replace Critical-based JNI API to prevent blocking garbage collector
Replace the following APIs: - GetStringCritical - ReleaseStringCritical - GetPrimitiveArrayCritical - ReleasePrimitiveArrayCritical with the following: - GetStringChars - ReleaseStringChars - GetByteArrayElements - ReleaseByteArrayElements The critical version of these API's would prevent the garbage collector from running until the corresponding Release API was called. This is in reference to this report: https://discuss.zetetic.net/t/sqlcipher-for-android-4-14-1-community-edition-release/7190/2
1 parent 50d507a commit 2862a81

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

sqlcipher/src/main/jni/sqlcipher/android_database_CursorWindow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,9 @@ namespace android {
275275
jbyteArray valueObj, jint row, jint column) {
276276
auto* window = reinterpret_cast<CursorWindow*>(windowPtr);
277277
jsize len = env->GetArrayLength(valueObj);
278-
void* value = env->GetPrimitiveArrayCritical(valueObj, NULL);
278+
jbyte* value = static_cast<jbyte*>(env->GetByteArrayElements(valueObj, NULL));
279279
status_t status = window->putBlob(row, column, value, len);
280-
env->ReleasePrimitiveArrayCritical(valueObj, value, JNI_ABORT);
280+
env->ReleaseByteArrayElements(valueObj, value, JNI_ABORT);
281281
if (status) {
282282
ALOGD("Failed to put blob. error=%d", status);
283283
return false;

sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,11 @@ static jlong nativePrepareStatement(JNIEnv* env, jclass clazz, jlong connectionP
354354
auto* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
355355

356356
jsize sqlLength = env->GetStringLength(sqlString);
357-
const jchar* sql = env->GetStringCritical(sqlString, NULL);
357+
const jchar* sql = env->GetStringChars(sqlString, NULL);
358358
sqlite3_stmt* statement;
359359
int err = sqlite3_prepare16_v2(connection->db,
360360
sql, sqlLength * sizeof(jchar), &statement, NULL);
361-
env->ReleaseStringCritical(sqlString, sql);
361+
env->ReleaseStringChars(sqlString, sql);
362362

363363
if (err != SQLITE_OK) {
364364
// Error messages like 'near ")": syntax error' are not
@@ -459,10 +459,10 @@ static void nativeBindString(JNIEnv* env, jclass clazz, jlong connectionPtr,
459459
auto* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
460460
auto* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr);
461461
jsize valueLength = env->GetStringLength(valueString);
462-
const jchar* value = env->GetStringCritical(valueString, NULL);
462+
const jchar* value = env->GetStringChars(valueString, NULL);
463463
int err = sqlite3_bind_text16(statement, index, value, valueLength * sizeof(jchar),
464464
SQLITE_TRANSIENT);
465-
env->ReleaseStringCritical(valueString, value);
465+
env->ReleaseStringChars(valueString, value);
466466
if (err != SQLITE_OK) {
467467
throw_sqlite3_exception(env, connection->db, NULL);
468468
}
@@ -473,9 +473,9 @@ static void nativeBindBlob(JNIEnv* env, jclass clazz, jlong connectionPtr,
473473
auto* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
474474
auto* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr);
475475
jsize valueLength = env->GetArrayLength(valueArray);
476-
auto* value = static_cast<jbyte*>(env->GetPrimitiveArrayCritical(valueArray, NULL));
476+
jbyte* value = static_cast<jbyte*>(env->GetByteArrayElements(valueArray, NULL));
477477
int err = sqlite3_bind_blob(statement, index, value, valueLength, SQLITE_TRANSIENT);
478-
env->ReleasePrimitiveArrayCritical(valueArray, value, JNI_ABORT);
478+
env->ReleaseByteArrayElements(valueArray, value, JNI_ABORT);
479479
if (err != SQLITE_OK) {
480480
throw_sqlite3_exception(env, connection->db, NULL);
481481
}

0 commit comments

Comments
 (0)