【问题标题】:call function from a shared lib in an Android application从 Android 应用程序中的共享库调用函数
【发布时间】:2015-08-29 20:06:15
【问题描述】:

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

我已经下载了jsqlite shared libs 并将它们解压缩到我的项目中到 HelloSpatialite/app/src/main/jniLibs 目录。 SO 帖子 (example) 说这是您在最近的 Android Studio 版本中需要做的所有事情。

这是我的目录列表:

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

-rwxr-xr-x@ 1 位用户员工 7778576 Jun 16 22:40 armeabi-v7a/libjsqlite.so

-rwxr-xr-x@ 1 位用户人员 7782620 Jun 16 22:30 armeabi/libjsqlite.so

-rwxr-xr-x@ 1 位用户员工 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

【问题讨论】:

  • 您的AndroidManifest.xml 是什么样的?您添加了<uses-library ...> 条目吗?
  • 我在本地的AndroidManifest.xml 中尝试了这个<uses-library android:name="libjsqlite" android:required="true" />,但没有明显区别。
  • 您链接的存档仅包含 jni 库,但我认为您还需要一个 java API jar 来链接它们。

标签: java android android-studio shared-libraries


【解决方案1】:

我终于想通了。

由于已经编译了共享库,我不得不将相应的 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 以及使用该模块的应用的链接。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2023-03-21
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多