将 sqlite 数据库包含在 C++ JNI 项目中

Include sqlite database into a C++ JNI project

本文关键字:JNI 项目 C++ sqlite 数据库 包含      更新时间:2023-10-16

我已经编写了C++类,现在我必须创建库才能在Android上使用它们。一个类处理我预先准备好的数据库(它包括图片和字符串)。在Qt中,它工作正常,因此代码是健壮的。我在Eclipse中有我的Android项目,JNI似乎还可以,因为在运行时android不会崩溃。问题是数据库未命中。

有人可以告诉我如何以通过构建apk文件将其包含在项目中吗?看过一个教程,它解释了将其放入 assets 文件夹并创建一个扩展的 Java 类,但我不知道当 i0m 在 JNI 级别(C++ 年)使用查询调用时它是否也有效。

正如我之前所悲伤的那样,我没有错误,无论是编译还是运行时间。该应用程序根本无法正常工作...因为没有数据库。当我将本机方法的定义留空时,它不会崩溃,因此这意味着对本机方法的调用工作正常。

举个例子,在C++类中,我有:

bool Database::open() {
if (sqlite3_open(dataBaseName, &databaseConnection) == SQLITE_OK){
    return true;
}
return false;
}

我用本地调用来称呼它:

JNIEXPORT void JNICALL Java_com_tamagotchi_ItemShop_openDatabase(JNIEnv *, jobject){
    db->open();
    }

。在 java 类上:

static {
    System.loadLibrary("nativeLib");
}
public native void openDatabase();

更新:我看过一个例子,其中数据库包含在 assets 文件夹中,并且可以使用 getResources().getAssets().open("some_file") 访问该文件。问题是这是针对Java端的,但我不想从Java端访问它,我需要使用本机库从C++/JNI端访问它。

我用另一种方式解决了。我在虚拟 SD 卡上加载了数据库,并在C++类中更改了数据库的路径。现在它工作正常。当然,这不是正确的方法,但我必须在周五之前介绍该项目......我也找到了另一个解决方案,但它需要 API 2.3,其中包括原生端的 getResources()。