我想使用 ndk 构建一个 3rd 方库 avahi。avahi 已经有 android 端口(带有有效的 Android.mk)。
我所做的:我已经成功创建了一个项目并将所有源代码复制到 jni/ 文件夹并运行 ndk-build。它构建 libavahi.so
我想做的事:我不想将所有源代码复制到 jni/ 文件夹中,而是将其存储在项目源代码树之外的文件夹中。我该怎么办?我查看了 NDK 文档/导入模块,但没有什么与我的情况相似。
ndk的新手,欢迎提出任何建议。
我想使用 ndk 构建一个 3rd 方库 avahi。avahi 已经有 android 端口(带有有效的 Android.mk)。
我所做的:我已经成功创建了一个项目并将所有源代码复制到 jni/ 文件夹并运行 ndk-build。它构建 libavahi.so
我想做的事:我不想将所有源代码复制到 jni/ 文件夹中,而是将其存储在项目源代码树之外的文件夹中。我该怎么办?我查看了 NDK 文档/导入模块,但没有什么与我的情况相似。
ndk的新手,欢迎提出任何建议。
你是对的,这不是Import Module的情况。您从本机代码引用avihi库的方式仍将是LOCAL_SHARED_LIBRARIES(请参阅 NDK 示例模块导出)。但是在您的jni/Android.mk
文件中,您可以include
对另一个文件使用命令。此命令与C#include
中的语句非常相似。此文件不需要位于您的项目树中。采取相同的样本,它是如何工作的:
来自 samples/module-exports/jni 的原始Android.mk :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_CFLAGS := -DFOO=2
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar/bar.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := zoo
LOCAL_SRC_FILES := zoo/zoo.c
LOCAL_SHARED_LIBRARIES := bar
include $(BUILD_SHARED_LIBRARY)
更改后的文件如下所示:
ZOO_LOCAL_PATH := $(call my-dir)
include ~/projects/bar/jni/Android.mk
LOCAL_PATH := $(ZOO_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := zoo
LOCAL_SRC_FILES := zoo/zoo.c
LOCAL_SHARED_LIBRARIES := bar
include $(BUILD_SHARED_LIBRARY)
而外部的bar/jni/Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_CFLAGS := -DFOO=2
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar/bar.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
现在,文件 bar.c 和 foo.c 都可以保存在 zoo 项目的树之外!