简体   繁体   English

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

[英]How to split my NDK project into lib and app

I have an NDK-based project (written mostly on C++) and I want to split its sources into two parts: "lib" (to be shared with other projects) and "app" (files specific to current project). 我有一个基于NDK的项目(主要用C ++编写),我想将其源代码分为两部分:“ lib”(与其他项目共享)和“ app”(特定于当前项目的文件)。

Now my Android.mk looks as follows: 现在我的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)

The only reason for splitting is that I want to add/remove lib source file once, because now I have to change Android.mk for all projects which need sources from MY_LIB_SOURCES . 拆分的唯一原因是我想一次添加/删除lib源文件,因为现在我必须为需要MY_LIB_SOURCES源的所有项目更改Android.mk。

Do I have to create a separate project that would produce a shared library? 我是否需要创建一个单独的项目来生成共享库? Or should it be a static library? 还是应该是静态库? Or maybe it's possible to just #include somehow file that enumerates MY_LIB_SOURCES into Android.mk of each app? 还是可能只是#include某种枚举MY_LIB_SOURCES文件到每个应用程序的Android.mk中?

You must divide your android.mk in two sections: 您必须将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)

If you want static library you have only to change include $(PREBUILT_SHARED_LIBRARY) to include $(PREBUILT_STATIC_LIBRARY) and LOCAL_SHARED_LIBRARIES := my_lib to LOCAL_STATIC_LIBRARIES += my_lib 如果您想要静态库,则只需更改include $(PREBUILT_SHARED_LIBRARY)即可include $(PREBUILT_STATIC_LIBRARY)LOCAL_SHARED_LIBRARIES := my_lib改为LOCAL_STATIC_LIBRARIES += my_lib

We usually create a separate folder for library sources, eg 我们通常为库源创建一个单独的文件夹,例如

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

my_lib
  libfile1.cpp
  libfile2.cpp
  Android.mk   (2)

This is the first ( application ) Android.mk 这是第一个( 应用程序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)

This is the second ( library ) Android.mk 这是第二个( 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)

Using the Andorid.mk name for MyLib is by convention; 按照惯例,MyLib使用Andorid.mk名称。 you could use some other file name, and change the include statement (line 17 of the first Android.mk file) accordingly. 您可以使用其他文件名,并相应地更改include语句(第一个Android.mk文件的第17行)。

You could also use the same $(call import-module) syntax, like 您还可以使用相同的$(call import-module)语法,例如

$(call import-module,my_lib)

But to do so, you must provide a NDK_MODULE_PATH environment variable that includes $(LOCAL_PATH)/../../ . 但要这样做,您必须提供一个NDK_MODULE_PATH环境变量,其中包括$(LOCAL_PATH)/../../

Your library will be rebuilt anew for each app (project) that includes it - either with the first naïve include method, or with $(call import-module) method. 对于包含它的每个应用程序(项目),都将使用第一个朴素的include方法或$(call import-module)方法重新构建您的库。 You can provide a prebuilt static library, but this is a different story. 您可以提供一个预建的静态库,但这是另一回事。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM