[英]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.