【问题标题】:Why isn't libgnustl_shared.so being copied from my APK?为什么没有从我的 APK 复制 libgnustl_shared.so?
【发布时间】:2013-04-22 12:38:22
【问题描述】:

我有一个带有 libs 文件夹结构的 android 项目,如下所示:

/libs
  /armeabi
    libfoo.so
    libbar.so
    libmystuff.so
    libgnustl_shared.so
  /armeabi-v7a
    libfoo.so
    libbar.so

foobar 是第三方库,mystuff 是我自己的库,来自一个单独的 android JNI 项目,它需要来自同一个 JNI 项目的gnustl_shared

当我在 Eclipse 中构建我的项目时,我可以使用unzip -l 查看生成的 APK 的内容,它确实表明所有这些库文件都已包含在内。

但是,安装 APK 后,/data/data/com.myproject/lib 文件夹不包含 libgnustl_shared.so,即使存在其他库。

这不可避免地会导致以下错误:

UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null

作为健全性检查,我运行了adb push ./libs/armeabi/libgnustl_shared.so /data/data/com.myproject/lib,果然,应用程序按预期启动。

我在构建日志或 Eclipse 控制台中没有看到任何表明构建或安装应用程序存在任何问题的信息。

  • 什么可能会阻止 libgnustl_shared.so 与我的应用程序一起安装?
  • 我可以去哪里了解安装 APK 后会发生什么?

如果我可以提供任何可能有帮助的具体信息,请在评论中告诉我。

【问题讨论】:

  • 仔细检查 mainfest 中包含所有库的语句。
  • @RobertRowntree -- 你能解释一下你的意思吗?我从来不需要在 AndroidManifest.xml 中为其他项目指定库,如果这就是你所指的。
  • 这是为了引用您有权访问的其他 Android 库项目。我所拥有的是一些.jar 文件和一些.so 文件的组合。我的project.properties 文件没有引用其他库项目,但libfoolibbarlibmystuff 都已正确安装。唯一缺少的库是libgnustl_shared。 NDK 开发绝非一帆风顺。 :[
  • stackoverflow.com/questions/14687287/… 请点击已接受答案下的链接,了解在设备上的 apk“解包”期间发生的情况以及为什么必须手动复制共享库

标签: android android-ndk java-native-interface


【解决方案1】:

我认为,在您的 JNI 项目的 Android.mk 文件中,最有可能的是,当您构建 libmystuff.so 时,您正在引用 libgnustl_shared.so,例如:

LOCAL_LDLIBS += -lgnustl_shared

也许您可以尝试将其添加为模块(NDK 确实专注于模块),例如:

include $(CLEAR_VARS) 
LOCAL_MODULE := gnustl_shared 
LOCAL_SRC_FILES := libgnustl_shared.so
include $(PREBUILT_SHARED_LIBRARY)

并且(在您正在构建 libmystuff.so 的部分中):

LOCAL_SHARED_LIBRARIES := gnustl_shared

并检查它是否最终被复制

【讨论】:

  • 谢谢。我错过了LOCAL_SHARED_LIBRARIES := gnustl_shared 行。
【解决方案2】:

我认为你的 libgnustl_shared.so 需要在 /armeabi-v7a 下而不是在 /armeabi

请尝试将 libgnustl_shared.so 复制到 /armeabi-v7a

【讨论】:

  • 嗨 @namuol ;如果您在 /data/data/com.myproject/lib 下找不到 libgnustl_shared.so 表示此库未打包到您的 APK。
  • @namuol 是您在Application.mk 中指定的APP_ABI?默认情况下,APP_ABI 等于 armeabi
  • 否 -- libgnustl_shared.so 实际上在 apk 中。我已经确定了这一点。
  • @namuol,我认为最好列出您的.MK 文件
  • 如果您删除了 libs/armeabi-v7a 目录并在源代码中只保留 armeabi 目录会发生什么?
【解决方案3】:

看这里的答案:How to link any library in ndk application 问题很可能出在您的 Android.mk 文件中。你应该有一条像底部那样的线:

include $(BUILD_SHARED_LIBRARY)

如果没有,那么您不包括您的共享库。

【讨论】:

  • 我在 JNI 项目中使用了这一行,在那里我得到了 libmystuff.solibgnu_stl_shared.so;我在问题中所指的项目不是 JNI 项目,因此不需要 Android.mk 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多