добавить пользовательскую функцию в sqlite/android

чтобы добавить UDF в SQLlite/Android Как загрузить расширения в SQLite? первое sqlite3_enable_load_extension должно быть выполнено, чтобы предотвратить «несанкционированный доступ», который я сделал в myfunc.c

#include <sqlite3.h>
#include <jni.h>
#include <stdlib.h>

jstring
Java_com_test_abc_SQLiteOpenHelper_enableExtension(JNIEnv* env, jobject thiz, sqlite3 *db)
{
    sqlite3_enable_load_extension(db, 1); //errorline, without any infos
    return (*env)->NewStringUTF(env, "enableExtension done");
}

Ява

package com.test.abc;
....
public class MyOpenHelper extends SQLiteOpenHelper {
    ...
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        enableExtension(db);
    }
    public native String enableExtension(SQLiteDatabase db);
}

безуспешно. Вызов JNI с Java на C никогда не возвращается, без ошибок он работает. Кто-нибудь знает, что здесь происходит не так? Лучше всего с примером кода.


person hannes ach    schedule 15.03.2013    source источник


Ответы (1)


Из Java вы получаете базу данных sqlite, которая создается/инициализируется с помощью встроенной в Android библиотеки sqlite. Затем вы передаете его коду jni, который работает с вашей пользовательской библиотекой sqlite, которая не является той же версией, и это соединение с базой данных не инициализируется с ним. Даже если бы это сработало, вы бы установили флаг на своей пользовательской sqllib, но не на интегрированной библиотеке Android. Вы должны полностью работать со своей пользовательской библиотекой, изменить пакет, как указано здесь: http://www.sqlite.org/android/doc/trunk/www/index.wiki

person pera    schedule 05.02.2015