Я разрабатываю приложение для Android, в которое потребуется загрузить самокомпилируемый плагин sqlite (libsimple). Скомпилированный плагин представляет собой файл .so.
sqlite-android может загружать такой файл как плагин. Но я новичок в разработке для Android и не знаю, как правильно загрузить файл.
В настоящее время я помещаю скомпилированный плагин в jniLibs.
app/
├─ src/
│ ├─ main/
│ │ ├─ jniLibs/
│ │ │ ├─ x86_64/
│ │ │ │ ├─libsimple.so
│ │ │ ├─ arm64_v8a/
│ │ │ │ ├─libsimple.so
Встроенный APK-файл содержит файлы.
apk-debug.apk/
├─ lib/
│ ├─ x86_64/
│ │ ├─libsimple.so
│ ├─ arm64_v8a/
│ │ ├─libsimple.so
Путь, определенный в коде, выглядит следующим образом:
private val libsimplePath = "${context.applicationInfo.nativeLibraryDir}/libsimple.so"
Однако при запуске приложения в студии Android с API 35 возвращаемый путь имеет вид
data/app/~~W0ZleGXEDPvGfIKN22O5Ow==/com.hal9000com.picfinder-eadN36R50XdAo86g8fxllN==/lib/x86_64/libsimple.so
и следующий тестовый код вернет false. Загрузка плагина также не удастся.
fun isPathReadable(path: String): Boolean {
val file = File(path)
return file.canRead()
}
Но когда я загружаю файл .so и выбираю его с помощью средства выбора файлов, он получит путь типа
/data/user/0/com.hal9000com.picfinder/cache/libsimple.so
и плагин будет работать.
Опрос ChatGPT не дал результатов, и я попробовал добавить
в AndroidManifest.xml, но ничего не меняется.
Часть кода, загружающая расширение, выглядит следующим образом.
import io.requery.android.database.sqlite.SQLiteDatabase
import io.requery.android.database.sqlite.SQLiteDatabaseConfiguration
import io.requery.android.database.sqlite.SQLiteCustomExtension
private val libsimplePath = "${context.applicationInfo.nativeLibraryDir}/libsimple.so"
private val cfg = SQLiteDatabaseConfiguration(":memory:", SQLiteDatabase.OPEN_READWRITE)
val ext = SQLiteCustomExtension(libsimplePath, null)
cfg.customExtensions.add(ext)
private val db = SQLiteDatabase.openDatabase(cfg, null, null)
Укажите путь к файлу .so, как определено в исходном коде sqlite-android.
public final class SQLiteCustomExtension {
public final String path;
public final String entryPoint;
/**
* Creates a SQLite extension description.
*
* @param path path to the loadable extension shared library
* e.g. "/data/data/(package)/lib/libSqliteICU.so"
* @param entryPoint extension entry point (optional)
* e.g. "sqlite3_icu_init"
*/
public SQLiteCustomExtension(String path, String entryPoint) {
if (path == null) {
throw new IllegalArgumentException("null path");
}
this.path = path;
this.entryPoint = entryPoint;
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ndroid-app