Как добавить файл плагина sqlite (.so) в приложение Android?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как добавить файл плагина sqlite (.so) в приложение Android?

Сообщение Anonymous »

Я разрабатываю приложение для 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»