9

我有一个具有libs如下文件夹结构的 android 项目:

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

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

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

但是,安装 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 时会发生什么?

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

4

3 回答 3

2

我认为,在您的 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

并检查它是否最终被复制

于 2013-11-24T17:33:24.997 回答
0

在此处查看答案:如何在 ndk 应用程序中链接任何库 问题很可能出在您的 Android.mk 文件中。你应该有一条像底部一样的线:

include $(BUILD_SHARED_LIBRARY)

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

于 2013-05-01T17:29:20.660 回答
0

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

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

于 2013-04-30T13:04:49.360 回答