为什么不从我的APK复制libgnustl_shared.so?

时间:2013-04-22 12:38:22

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

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

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

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

当我在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时会发生什么?

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

3 个答案:

答案 0 :(得分: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

并检查它是否最终被复制

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

include $(BUILD_SHARED_LIBRARY)

如果没有,那么您不会包含共享库。