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

时间:2014-12-28 18:32:35

标签: 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.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源文件,因为现在我必须为所有需要MY_LIB_SOURCES来源的项目更改Android.mk。

我是否必须创建一个可以生成共享库的单独项目?或者它应该是一个静态库?或者也许只能#include以某种方式将MY_LIB_SOURCES枚举到每个应用的Android.mk文件中?

2 个答案:

答案 0 :(得分:1)

你必须将你的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 $(PREBUILT_SHARED_LIBRARY)更改为include $(PREBUILT_STATIC_LIBRARY),将LOCAL_SHARED_LIBRARIES := my_lib更改为LOCAL_STATIC_LIBRARIES += my_lib

答案 1 :(得分:1)

我们通常会为库源创建一个单独的文件夹,例如

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)

这是第二个( Android.mk

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)

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

您也可以使用相同的$(call import-module)语法,例如

$(call import-module,my_lib)

但要这样做,您必须提供 NDK_MODULE_PATH 环境变量,其中包含 $(LOCAL_PATH)/../../

您的图书馆将为包含它的每个应用(项目)重新重建 - 使用第一个天真包含方法或$(call import-module)方法。您可以提供prebuilt静态库,但这是另一回事。