【问题标题】:How to add multi shared libraries in android ndk?如何在android ndk中添加多个共享库?
【发布时间】:2011-08-29 03:07:36
【问题描述】:

目前我的程序中有很多共享库*.so,但似乎NDK只支持jni将使用的主共享库。

示例:Java 应用程序将使用库 A.so,而 A.so 依赖于 B、C 当我将 B 和 C 构建到静态库时,然后通过 LOCAL_STATIC_LIBRARIES 在 A.so 中使用它们,该应用程序运行良好。 当我将 B 和 C 构建到共享库时,然后通过 LOCAL_SHARED_LIBRARIES 在 A.so 中使用它们,并通过 System.loadLibrary("...") 加载它们中的每一个,应用程序将在启动时崩溃。

我想使用所有其他库作为共享库,以便我可以保持我的应用程序灵活,我怎样才能在 android 中正确使用多个共享库?

附加我的 Android.mk 代码:

DEPENDENCE_LIBS := gthread-2.0 gmodule-2.0 gobject-2.0 glib-2.0

ifeq ($(BUILD_STATIC),true)
    LOCAL_STATIC_LIBRARIES := $(DEPENDENCE_LIBS)
else
    LOCAL_SHARED_LIBRARIES := $(DEPENDENCE_LIBS)
endif

include $(BUILD_SHARED_LIBRARY)

如果我将 BUILD_STATIC 定义为 true,一切正常,但如果我将 BUILD_STATIC 定义为 false,无法工作

【问题讨论】:

    标签: android shared-libraries android-ndk


    【解决方案1】:

    其实我原来的方法是正确的,我只是在库名中有拼写错误。 现在,当我将 BUILD_STATIC 定义为 false,并使用 System.loadLibrary("lib-name") 加载每个共享库时,整个过程可以正常工作。

    【讨论】:

      【解决方案2】:

      我不认为 System.loadLibrary 将 B.so 或 C.so 链接到 A.so。它用于加载您将通过 JNI 调用的主库。

      如果 A.so 在构建时链接到 B.so 和 C.so 是否有效?我在想系统应该知道自动链接它们。如果没有,请尝试使用uselib 系统调用。

      【讨论】:

      • 即使我通过与 B.so 和 C.so 链接来构建 A.so(使用 LOCAL_SHARED_LIBRARIES := $(DEPENDENCE_LIBS)),它也无法正常工作。顺便说一句,我不能让 uselib(...) 作为参考
      • Android 中不存在 uselib 还是它不起作用?如果它不存在,那么 A.so 在尝试构建它时不会链接。如果它以 Android Linux 系统调用的形式存在,则可能是您调用不正确。
      • uselib 在 Android 中不存在,构建无法通过
      • 啊,我的错。我自己从未真正使用过 uselib() ,但它出现在 Google 搜索中。它必须特定于其他发行版。而是使用 dlopen 加载 B.so 和 C.so,并在需要时使用 dlclose 卸载它们 - 但您可能不需要。
      • 我很惊讶在构建 A.so 时将 B.so 和 C.so 链接到 A.so 并不仅仅起作用。如果你不这样做,A.so 的链接应该会因为未解析的符号而失败。也许你需要把你的两个额外的库放在一个特别的地方,或者做一些特别的事情来告诉 Android 它们在那里?
      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多