Android 如何将我的NDK项目拆分为lib和app

Android 如何将我的NDK项目拆分为lib和app,android,c++,android-ndk,Android,C++,Android Ndk,我有一个基于NDK的项目(主要是用C++编写的),我想将其源代码分为两部分:“lib”(与其他项目共享)和“app”(特定于当前项目的文件) 现在,我的Android.mk如下所示: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyProj MY_LIB_SOURCES := \ libfile1.cpp \ libfile2.cpp MY_APP_SOURCES := \ appfile1.

我有一个基于NDK的项目(主要是用C++编写的),我想将其源代码分为两部分:“lib”(与其他项目共享)和“app”(特定于当前项目的文件)

现在,我的Android.mk如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := MyProj

MY_LIB_SOURCES := \
libfile1.cpp \
libfile2.cpp

MY_APP_SOURCES := \
appfile1.cpp \
appfile2.cpp

LOCAL_SRC_FILES += $(MY_LIB_SOURCES)
LOCAL_SRC_FILES += $(MY_APP_SOURCES)

LOCAL_STATIC_LIBRARIES := android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)
拆分的唯一原因是我想添加/删除lib源文件一次,因为现在我必须更改Android.mk以用于所有需要来自
MY_lib_sources
的源的项目


我是否必须创建一个单独的项目来生成一个共享库?还是应该是一个静态库?或者可以只
#以某种方式将枚举
MY_libu____源的
文件包含在每个应用程序的Android.mk中?

您必须将Android.mk分为两部分:

LOCAL_PATH := $(call my-dir)

## The lib ##
include $(CLEAR_VARS)
LOCAL_MODULE    := my_lib

SRC_LIB := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(SRC_LIB:$(LOCAL_PATH)/%=%)

include $(PREBUILT_SHARED_LIBRARY)

## The App ##
include $(CLEAR_VARS)
LOCAL_MODULE := my_app
LOCAL_CPP_EXTENSION := .cxx .cpp .cc

LOCAL_SRC_FILES := \
    appfile1.cpp \
    appfile2.cpp

LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_SHARED_LIBRARIES := my_lib
LOCAL_LDLIBS    += -landroid

include $(BUILD_EXECUTABLE)

$(call import-module,android/native_app_glue)

如果您想要静态库,只需将
include$(预构建的共享库)
更改为
include$(预构建的静态库)
LOCAL\u共享库:=my\u lib
更改为
LOCAL\u static\u LIBRARIES+=my\u lib
我们通常为库源创建一个单独的文件夹,例如

project
  jni
    appfile1.cpp
    appfile2.cpp
    Android.mk (1)

my_lib
  libfile1.cpp
  libfile2.cpp
  Android.mk   (2)
这是第一个(应用程序)Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := MyProj

MY_APP_SOURCES := \
appfile1.cpp \
appfile2.cpp

LOCAL_SRC_FILES += $(MY_APP_SOURCES)

LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_STATIC_LIBRARIES += MyLib

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/../../my_lib/Android.mk
$(call import-module,android/native_app_glue)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := MyLib

MY_LIB_SOURCES := \
libfile1.cpp \
libfile2.cpp

LOCAL_SRC_FILES += $(MY_LIB_SOURCES)

include $(BUILD_STATIC_LIBRARY)
这是第二个(库)Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := MyProj

MY_APP_SOURCES := \
appfile1.cpp \
appfile2.cpp

LOCAL_SRC_FILES += $(MY_APP_SOURCES)

LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_STATIC_LIBRARIES += MyLib

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/../../my_lib/Android.mk
$(call import-module,android/native_app_glue)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := MyLib

MY_LIB_SOURCES := \
libfile1.cpp \
libfile2.cpp

LOCAL_SRC_FILES += $(MY_LIB_SOURCES)

include $(BUILD_STATIC_LIBRARY)
使用和id.mk名称作为MyLib是惯例;您可以使用其他文件名,并相应地更改include语句(第一个Android.mk文件的第17行)

您也可以使用相同的语法,如

$(call import-module,my_lib)
但要做到这一点,您必须提供一个NDK\U模块路径环境变量,其中包括$(本地路径)/../../../


您的库将为包含它的每个应用程序(项目)重新构建-使用第一个天真的include方法,或者使用方法。您可以提供一个静态库,但这是另一回事。

如果我使用libfile3.cpp扩展mylib,那么我必须将libfile3.cpp添加到所有使用lib的应用程序的所有Android.mk中。这样的复制粘贴不是我想要实现的。你可以从一个路径添加所有文件,因此如果你在该路径中添加一个文件,该文件将包含在你的项目中,你只需使用通配符,我编辑了我的帖子。