将函数从静态库导出到共享

时间:2014-01-15 14:33:42

标签: android c android-ndk java-native-interface static-libraries

在Android NDK中,我尝试从小型“模块” - 静态库构建共享库。例如:

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module1.c

include $(PREBUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := module2
LOCAL_SRC_FILES := module2.c

include $(PREBUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := main-module

LOCAL_STATIC_LIBRARIES := module1 \ module2

include $(BUILD_SHARED_LIBRARY)

但是当我尝试从共享库(主模块)调用它们时,module1和module2中的函数不可见。

module1.c和module2.c中的函数是可导出的,因为如果构建这样的库我可以直接调用它们,例如:

include $(CLEAR_VARS)

LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module1.c

include $(BUILD_SHARED_LIBRARY)

如何在共享库中显示静态库中的函数(如第一个示例中所述)。可能需要任何编译器/链接器标志吗?

2 个答案:

答案 0 :(得分:1)

使用BUILD_STATIC_LIBRARY而不是PREBUILD_STATIC_LIBRARY。

前者是如何定义一个'静态库'模块,它将包含通过编译LOCAL_SRC_FILES中的源获得的目标文件。

后者无法被ndk-build识别,将被默默忽略。

为了澄清,还存在PREBUILT_STATIC_LIBRARY(注意“T”),当你有二进制库文件(例如libmodule1.a)时使用它。

有关模式详情,请参阅$ NDK / docs / ANDROID-MK.html。

答案 1 :(得分:0)

不幸的是BUILD_STATIC_LIBRARY也不起作用。我认为原因是主模块不使用任何源文件,如果我包含至少一个使用其中一个模块的函数的源文件,这些模块将包含在主模块中。例如:

Android.mk:

include $(CLEAR_VARS)

LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module1.c

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := module2
LOCAL_SRC_FILES := module2.c

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := main-module
LOCAL_SRC_FILES := mainmodule.c
LOCAL_STATIC_LIBRARIES := module1 \ module2

include $(BUILD_SHARED_LIBRARY)

例如,mainmodule.c使用module1和module2中的一些函数。

但是如何在不使用mainmodule.c的情况下将静态模块包含到主模块中?