From 55ed7afd15a6e2b606cc0d93344e9241ceb50751 Mon Sep 17 00:00:00 2001 From: Nick Parker Date: Thu, 12 Jun 2025 08:49:02 -0500 Subject: [PATCH 1/5] Enable extension loading at runtime --- .../main/jni/sqlcipher/android_database_SQLiteConnection.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp b/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp index fe82135..1960b75 100644 --- a/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp +++ b/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp @@ -230,6 +230,9 @@ static jlong nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFla return 0; } + // Enable extension loading + sqlite3_enable_load_extension(db, 1); + // Create wrapper object. auto* connection = new SQLiteConnection(db, openFlags, path, label); From 9c640d25515e203b5da96a3057012ef0a4d5b2f1 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Mon, 14 Jul 2025 17:04:55 -0400 Subject: [PATCH 2/5] Uses explicit error code when throwing if sqlite3_key or sqlite3_rekey fails --- .../main/jni/sqlcipher/android_database_SQLiteConnection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp b/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp index 1960b75..2ae8e81 100644 --- a/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp +++ b/sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp @@ -157,7 +157,7 @@ static jint nativeKey(JNIEnv* env, jclass clazz, jlong connectionPtr, jbyteArray } if (rc != SQLITE_OK) { ALOGE("sqlite3_key(%p) failed: %d", connection->db, rc); - throw_sqlite3_exception(env, connection->db, "Could not key db."); + throw_sqlite3_exception_errcode(env, rc, "Could not key db."); } return rc; } @@ -178,7 +178,7 @@ static jint nativeKey(JNIEnv* env, jclass clazz, jlong connectionPtr, jbyteArray } if (rc != SQLITE_OK) { ALOGE("sqlite3_rekey(%p) failed: %d", connection->db, rc); - throw_sqlite3_exception(env, connection->db, "Could not rekey db."); + throw_sqlite3_exception_errcode(env, rc, "Could not rekey db."); } return rc; } From e772fa6c8995ad3bd540ac6cb3d9c295004c4f5f Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jul 2025 16:52:55 -0400 Subject: [PATCH 3/5] Defines required macros for default android build --- sqlcipher/src/main/jni/sqlcipher/Android.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqlcipher/src/main/jni/sqlcipher/Android.mk b/sqlcipher/src/main/jni/sqlcipher/Android.mk index 6ed942b..fe08844 100644 --- a/sqlcipher/src/main/jni/sqlcipher/Android.mk +++ b/sqlcipher/src/main/jni/sqlcipher/Android.mk @@ -12,7 +12,8 @@ LOCAL_CFLAGS += -DSQLITE_HAS_CODEC -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_TEMP_STOR -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 \ -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 -DSQLITE_ENABLE_SESSION \ - -DSQLITE_ENABLE_PREUPDATE_HOOK -DSQLITE_ENABLE_DBSTAT_VTAB + -DSQLITE_ENABLE_PREUPDATE_HOOK -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown endif LOCAL_CPPFLAGS += -Wno-conversion-null From e952e8255d3d785e5c873a2d21fc5ad3f42b3968 Mon Sep 17 00:00:00 2001 From: Nick Parker Date: Wed, 23 Jul 2025 09:31:16 -0500 Subject: [PATCH 4/5] Fix typo in readme code sample --- README.md | 2 +- README.md.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 184f9e9..84939f8 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ SQLCipher for Android may also integrate with the Room API via the `SupportOpenH System.loadLibrary("sqlcipher"); String password = "Password1!"; File databaseFile = context.getDatabasePath("demo.db"); -SupportOpenHelperFactory factory = new SupportOpenHelperFactory("password.getBytes(StandardCharsets.UTF_8)); +SupportOpenHelperFactory factory = new SupportOpenHelperFactory(password.getBytes(StandardCharsets.UTF_8)); db = Room.databaseBuilder(context, AppDatabase.class, databaseFile.getAbsolutePath()) .openHelperFactory(factory).build(); ``` diff --git a/README.md.template b/README.md.template index 1a215f0..7d38363 100644 --- a/README.md.template +++ b/README.md.template @@ -71,7 +71,7 @@ SQLCipher for Android may also integrate with the Room API via the `SupportOpenH System.loadLibrary("sqlcipher"); String password = "Password1!"; File databaseFile = context.getDatabasePath("demo.db"); -SupportOpenHelperFactory factory = new SupportOpenHelperFactory("password.getBytes(StandardCharsets.UTF_8)); +SupportOpenHelperFactory factory = new SupportOpenHelperFactory(password.getBytes(StandardCharsets.UTF_8)); db = Room.databaseBuilder(context, AppDatabase.class, databaseFile.getAbsolutePath()) .openHelperFactory(factory).build(); ``` From a5e26619f6244bab719206f75810841ecc0450ad Mon Sep 17 00:00:00 2001 From: Nick Parker Date: Tue, 5 Aug 2025 11:32:49 -0500 Subject: [PATCH 5/5] Update URL for Sonatype publishing --- sqlcipher/build.gradle | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/sqlcipher/build.gradle b/sqlcipher/build.gradle index 9732cc5..9fb5fdf 100644 --- a/sqlcipher/build.gradle +++ b/sqlcipher/build.gradle @@ -99,18 +99,8 @@ def isReleaseBuild() { return mavenVersionName.contains("SNAPSHOT") == false } -def getReleaseRepositoryUrl() { - return hasProperty('mavenReleaseRepositoryUrl') ? mavenReleaseRepositoryUrl - : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" -} - -def getSnapshotRepositoryUrl() { - if(hasProperty('mavenLocalRepositoryPrefix')) { - return "${mavenLocalRepositoryPrefix}${buildDir}/${mavenSnapshotRepositoryUrl}" - } else { - return hasProperty('mavenSnapshotRepositoryUrl') ? mavenSnapshotRepositoryUrl - : "https://oss.sonatype.org/content/repositories/snapshots/" - } +static def getReleaseRepositoryUrl() { + return "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/" } def getRepositoryUsername() { @@ -166,9 +156,7 @@ afterEvaluate { repositories { maven { - def repoUrl = isReleaseBuild() - ? getReleaseRepositoryUrl() - : getSnapshotRepositoryUrl() + def repoUrl = getReleaseRepositoryUrl() url = repoUrl credentials { username = getRepositoryUsername() @@ -180,7 +168,7 @@ afterEvaluate { } signing { - required { isReleaseBuild() && gradle.taskGraph.hasTask("publish") } + required { gradle.taskGraph.hasTask("publish") } sign publishing.publications.mavenJava } }