我已经阅读了很多关于如何使用Android.mk系统共享预建库的帖子。解决方案归结为两个步骤:
(您可以将“STATIC”替换为“SHARED”来构建和使用.a而不是.so)
我要做的是添加第0步:从源代码构建库。如果我更改了有助于库的源文件,我希望Android.mk系统按顺序执行步骤0,1和2。
我在Eclipse / ADT中有两个项目:
我在这里问的问题集中在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.
我想我理解这些错误,但我没有找到实现我想要的方法。
我错过了什么?
答案 0 :(得分:0)
您可以完全避免第1步,只需从源重建库。我不确定我理解你描述的三个步骤的好处。随意澄清。
在所有情况下,你对ndk-build行为的分析都是现实的,所有这些都是完全有意的。
NDK本身提供了几个预构建的库,并允许您根据需要从源代码重建它们。例如,如果查看sources / cxx-stl / stlport / Android.mk,您将看到变量(STLPORT_FORCE_REBUILD)用于控制是否使用预构建的二进制文件,或者从源代码重建它们。
也许为您的项目使用类似的方法。