【问题标题】:android native lib not installed with APKandroid 本机库未随 APK 一起安装
【发布时间】:2013-12-14 17:43:04
【问题描述】:

我制作了一个使用一些原生库的 android 库项目。

我已经制作了 jni 包装器并将本机库 (.so) 放在 libs// 文件夹中。原生库使用 cmake 编译,适用于 armeabi、armeabi-v7a、x86 和 mips。

我将这个项目导出到一个 jar 中,并将这个 jar 放入一个“普通”的 android 项目中。然后我将这个项目导出到一个 apk 中,可以看到我的库是捆绑到其中的。

但是,当我安装 apk 时,与设备对应的库不会复制到 /data/data/com.my.app/lib 中,显然,运行应用程序会抱怨找不到库 (UnsatisfiedLinkError)。

我已经搜索了 SO 和所有我能找到的答案,但没有找到解决我问题的答案。

我正在使用 Eclipse,顺便说一句

感谢您的帮助

更新

好的,我已经阅读了 ndk 中的文档并查看了示例,不幸的是,我看不到解决方案。

ndk 将 c 代码构建到共享库中,并将它们放置在项目中的适当位置。但它不会生成任何说明库必须与 apk 一起安装的信息。

我的目标是提供一个 android 库(所以是一个 jar),它可以包含在一个 android 应用程序中。我没有看到我正在做的事情(使用 cmake 编译 c 库并将 jni 和 java 编译的类打包到 jar 中)与使用 android.mk 所做的事情之间的真正区别

如果您发现我遗漏了什么,请随时告诉我(即使很明显)。

谢谢

更新

我做了一个肮脏的 hack:在我的应用程序的 libs 文件夹中,我放置了包含我的类和我的本机库的 jar 文件以及每个拱门的 .so 文件的副本。惊喜,/data/data/com.me.myapp/lib 中没有安装这些库

似乎确认是包装问题。

【问题讨论】:

  • 我建议您阅读 NDK 附带的文档。
  • 您不能只将库放在 NDK 项目中,您必须将其包含在 Android.mk 文件中 - 有很多关于此的文档以及 SO 上的示例
  • 我已经阅读了一些关于如何构建本机库的文档(不是 sdk 的文档)。但显然,我读错了文档。我会看看,稍后再回来。谢谢
  • 您是否尝试过直接链接您的 .so 文件而不是将它们放入 jar 中?顺便把它们放进罐子里的目的是什么?
  • 这就是我第二次更新的重点:如果我将 .so 直接添加到我的 android 应用程序的 libs 文件夹中,它们将与 apk 一起安装。将 .so 放入 jar 中的目的是只向其他开发人员提供一件东西

标签: android android-ndk apk


【解决方案1】:

我将此项目导出到 jar 并将此 jar 放入“正常” 安卓项目。然后我将此项目导出到 apk 并可以看到 我的库是捆绑到其中的。

问题在于 Android 打包系统无法处理 JAR 中的二进制资产。为了让您的应用程序项目找到并包含生成的.so 文件,您需要将库项目作为“Android 库项目”引用:

【讨论】:

    【解决方案2】:

    你调用 ndk-build 命令了吗?

    详情请参阅下面的说明。

    http://developer.android.com/tools/sdk/ndk/index.html

    您可以通过进入 /samples// 然后调用 ndk-build 命令为示例应用构建共享库。生成的共享库将位于 /samples//libs/armeabi/ 下(ARMv5TE 机器代码)和/或 /samples//libs/armeabi-v7a/ 下(ARMv7 机器代码)。

    【讨论】:

    • 我的原生库构建良好。我不称自己为 ndk-build,但它是由 cmake 构建调用的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多