基本流程如下
在JNI下(第一层嵌套)
在
include $(CLEAR_VARS)
之后
$(call import-add-path, $(LOCAL_PATH)/external)
这里是告诉ndk, 添加一个模块的目录, 这里仅仅是添加目录, 实际还没有执行
在最后需要把moudle import进入这次编译,路径就定义 . 就可以了,之前在import-add-path已经把目录包含进来
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
第二层Android.mk
把需要的组件目录添加 这个目录下多是自己封装的cpp/c文件
如果有第三方组件的头文件,但是木有在下层Android.mk封装的话,需要
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/curl
包第三方库的头文件包含进来,在编译时会自动到这个目录下查找,如果没有的话就不需要了
在第二层Android.mk下,首先需要把自己封装的cpp/c都
LOCAL_SRC_FILES :=\
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
一下, 这里可以使用*.cpp通配符查找目录下所有cpp/c文件,当然这次是手写的
这是LOCAL_PATH还是当前的目录,所以大胆的放心使用
在这里需要把编译查询包含进来,比如
LOCAL_CFLAGS := -DUSE_FILE32API -fexceptions -DANDROID
LOCAL_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat
LOCAL_EXPORT_CFLAGS := -DUSE_FILE32API
LOCAL_EXPORT_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat
嵌套自己写的cpp/c就到此为止了,在第三层Android.mk下,会发现LOCAL_PATH成了ndk-bundle,估计是自己乱import-add-path的后果
最后有需要依赖第三方库的话
include $(BUILD_SHARED_LIBRARY)
$(call import-module, thridlibrary/android/curl/prebuilt/android)
$(call import-module, xxx/zlib/prebuilt/android)
把第三方库的路径import-module进来, 这是后import-module的付目录是第一层 import-add-path的路径,所以在这里不需要add-import一次
在第三层Android.mk
这里最主要的工作就是把第三方的静态库包含进来
完整的路径如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := medium_curl_static
LOCAL_MODULE_FILENAME := curl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/curl
LOCAL_STATIC_LIBRARIES += medium_ssl_static
LOCAL_STATIC_LIBRARIES += medium_crypto_static
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := medium_crypto_static
LOCAL_MODULE_FILENAME := crypto
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := medium_ssl_static
LOCAL_MODULE_FILENAME := ssl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)
记录一个坑, 在 ndk的不知道什么版本, crypto编译会抛出一个bsd_signal的错误,这时切换到底版本的ndk,谁特么知道什么原因,下次再纠结这个问题吧