从 Android 应用程序中的共享库调用函数

call function from a shared lib in an Android application

我很难在 Android 应用程序中使用共享库。

我已经下载了 jsqlite shared libs and unzipped these into my project to the HelloSpatialite/app/src/main/jniLibs directory. SO posts (example) 说这就是你在最近的 Android Studio 版本中需要做的所有事情。

这是我的目录列表:

HelloSpatialite/app/src/main/jniLibs]: ls -l /.so

-rwxr-xr-x@ 1 user staff 7778576 Jun 16 22:40 armeabi-v7a/libjsqlite.so

-rwxr-xr-x@ 1 user staff 7782620 Jun 16 22:30 armeabi/libjsqlite.so

-rwxr-xr-x@ 1 user staff 12080476 Jun 16 22:51 x86/libjsqlite.so

我已验证共享库包含在 APK 中 as in step 3 here.

但是,现在我无法使用该库中的 类 和函数。

如果 my java code 使用 import jsqlite.Database;,我将从 Android Studio 获得 Error:(6, 15) error: package jsqlite does not exist

我正在尝试关注 android-spatialite tutorial。本教程的代码示例来自 eclipse 时代,似乎也以稍微不同的方式获取 jsqlite 包。

有人可以帮助我走上正轨吗?

编辑:我的代码(减去共享对象)位于 github

我终于弄明白了。

由于共享库已经编译,我不得不将相应的 java 文件命名空间保留在 package jsqlite;。真正的问题是弄清楚如何将那些 java 文件实际保留在该顶级范围内。

我最终修改了我的模块的 AndroidManifest.xml,使其没有通常的 "yourcompany.packagename" 作用域,而是只使用了 "packagename"。 通常:

<manifest
    package="com.example.spatialite_database_driver">
</manifest>

变成

<manifest
    package="spatialite_database_driver">
</manifest>

我不确定这是否是最理想的方案,但它让我的模块无需重新编译 JNI 代码即可工作。

我这里有用于成功设置此模块的过程: https://github.com/kristina-hager/Spatialite-Database-Driver/blob/master/README.md 连同 link 到使用该模块的应用程序。

注意:对于这个模块,没有准备好的 .jar 或 .aar 文件可用,所以我在模块中使用共享对象 + java src 文件。