Android NDK:如何构建然后使用预构建的库

时间:2014-03-27 17:07:06

标签: android-ndk libraries dependency-management

我已经阅读了很多关于如何使用Android.mk系统共享预建库的帖子。解决方案归结为两个步骤:

  1. 包含已构建库的目录使用* include $(PREBUILT_SHARED_LIBRARY)*
  2. 使用库的项目使用* LOCAL_SHARED_LIBRARIES *
  3. (您可以将“STATIC”替换为“SHARED”来构建和使用.a而不是.so)

    我要做的是添加第0步:从源代码构建库。如果我更改了有助于库的源文件,我希望Android.mk系统按顺序执行步骤0,1和2。

    我在Eclipse / ADT中有两个项目:

    1. MyApp - 使用MyLibrary
    2. MyLibrary - 包含库的源文件
    3. 我在这里问的问题集中在MyLibrary项目上。以下是MyLibrary的Android.mk:

      LOCAL_PATH := $(call my-dir)
      
      # step 0: build my library
      
      include $(CLEAR_VARS)
      LOCAL_MODULE := mylibrary
      LOCAL_LDLIBS := -llog
      LOCAL_SRC_FILES := libsrc1.c libsrc2.c
      include $(BUILD_SHARED_LIBRARY)
      
      # step 1: export my library (PREBUILT_SHARED_LIBRARY):
      
      include $(CLEAR_VARS)
      LOCAL_MODULE := mylibrary-prebuilt
      LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libmylibrary.so
      LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
      include $(PREBUILT_SHARED_LIBRARY)
      

      如果我在此项目中执行项目 - >清除... ,然后执行项目 - >构建项目,则会收到错误消息:

      错误:jni / Android.mk:mylibrary-prebuilt:LOCAL_SRC_FILES指向丢失的文件。

      clean删除.so并且我猜测PREBUILT_SHARED_LIBRARY在BUILD_SHARED_LIBRARY重建库并复制它之前检测到丢失的.so(即使步骤的顺序正确)。

      如果我注释掉第1步并构建,则正确构建libmylibrary.so并将其复制到libs / armeabi / libmylibrary.so。如果我然后取消注释第2步并执行项目 - >构建项目,那就是没有先干净,我收到这些警告和错误:

      warning: overriding commands for target `obj/local/armeabi/libmylibrary.so'
      warning: ignoring old commands for target `obj/local/armeabi/libmylibrary.so'
      warning: overriding commands for target `libs/armeabi/libmylibrary.so'
      warning: ignoring old commands for target `libs/armeabi/libmylibrary.so'
      
      make: *** No rule to make target `jni/../libs/armeabi/libmylibrary.so', needed by `obj/local/armeabi/libmylibrary.so'.  Stop.
      

      我想我理解这些错误,但我没有找到实现我想要的方法。

      我错过了什么?

1 个答案:

答案 0 :(得分:0)

您可以完全避免第1步,只需从源重建库。我不确定我理解你描述的三个步骤的好处。随意澄清。

在所有情况下,你对ndk-build行为的分析都是现实的,所有这些都是完全有意的。

NDK本身提供了几个预构建的库,并允许您根据需要从源代码重建它们。例如,如果查看sources / cxx-stl / stlport / Android.mk,您将看到变量(STLPORT_FORCE_REBUILD)用于控制是否使用预构建的二进制文件,或者从源代码重建它们。

也许为您的项目使用类似的方法。