Android的NDK - 警队图书馆重建上的配置变化(Android NDK - Force l

2019-09-24 07:20发布

有没有办法迫使Android的NDK改变Eclipse构建配置时重建一个特定的图书馆吗?

我建立使用Android NDK构建C ++库建设的Android项目。 我使用Eclipse与塞阔亚插件。 一切设置和行之有效的。

但是,我遇到了与构建配置的问题。 您可以通过右键单击项目 - >属性管理构建配置,然后进入C / C ++编译部分。 这允许您创建传统的调试和发布版本,大多数C ++库在某种程度上依赖。

这是我的“调试”配置的例子:

V=1 NDK_DEBUG=1 NDK_APPLICATION_MK=config/debug/Application.mk

这些工作的很好,只是当我再次打开和配置之间来回,它不会触发重建我建立了图书馆。 这将预期的东西像Visual Studio,其中每个生成配置转储到不同的目录,但在Eclipse中一切都被转储到同一目录中。 我不得不实际改变相关的源文件来触发重建。 那么最终发生的是我最终的调试配置下运行(例如),但链接到建在释放库。

所以我的问题是: 有没有办法迫使NDK重建库更改配置时? 我知道-B命令我可以添加的,但重建的一切每次 。 重建每一次,如果我可以只是一个特定的图书馆这样做(在这种情况下libBootInfo)我会好起来的。

这里是我的根Android.mk文件的样子:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := game$(MY_BUILD_CONFIG_EXTENSION)

# Include files are relative to the NDK root directly (fix by prepending with $(LOCAL_PATH))
# Source files are relative $(LOCAL_PATH)

#LOCAL_LDLIBS    := -landroid

# Add all source file names to be included in lib separated by a whitespace
LOCAL_SRC_FILES :=  ../../../../../../engine/code/main/mainandroid.cpp

# Module dependencies are expressed with LOCAL_STATIC_LIBRARIES and LOCAL_SHARED_LIBRARIES.
# we're building the "main" entry point, so it doesn't depend on much
LOCAL_STATIC_LIBRARIES := libDebug$(MY_BUILD_CONFIG_EXTENSION) libCore$(MY_BUILD_CONFIG_EXTENSION)

include $(BUILD_SHARED_LIBRARY)

$(call import-module,libBdCore)
$(call import-module,libDebug)

##################################################################
## In addition to the core game library, we also build another
## *.so file here: "libBootInfo". This very small library is used
## by Java to find out which version of game to load based on
## the current build configuration.
##

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libBootInfo

# Add all source file names to be included in lib separated by a whitespace
# TODO: This path is relative to "android-ndk\build\core" which seems
#       different from the LOCAL_SRC_FILES in game above. It seems like
#       the build process leaves us in a different directory than we started.
#       We make need to look into a way to make sure that this path always 
#       works regardless of what came before it.
#
LOCAL_SRC_FILES := ../../../../engine/code/main/bootinfo.cpp

include $(BUILD_SHARED_LIBRARY)

Answer 1:

NDK建设始终刷新中的.solib/armeabi 。 在obj目录,在另一方面,包含独立的树木用于调试和发布版本,每个模块。

不幸的是,这是相当容易,如果你搞砸这个设置Android.mk做一些其它事情不TGE框架支持。

例如,在你的情况下,长上行路径cpp文件( ../../../.. )可能是一个坏主意。 我会建议设置LOCAL_PATH每个模块,并避免../LOCAL_SRC_FILES

这里是我的Android.mk建议的调整:

ANDROID_MK_PATH := $(call my-dir)
LOCAL_PATH := $(ANDROID_MK_PATH)/../../../engine/code/main

include $(CLEAR_VARS)

LOCAL_MODULE := game$(MY_BUILD_CONFIG_EXTENSION)
LOCAL_SRC_FILES :=  mainandroid.cpp
LOCAL_STATIC_LIBRARIES := libDebug$(MY_BUILD_CONFIG_EXTENSION) libCore$(MY_BUILD_CONFIG_EXTENSION)

include $(BUILD_SHARED_LIBRARY)

##################################################################
## In addition to the core game library, we also build another
## *.so file here: "libBootInfo". This very small library is used
## by Java to find out which version of game to load based on
## the current build configuration.
##

include $(CLEAR_VARS)

LOCAL_MODULE := libBootInfo
LOCAL_SRC_FILES := bootinfo.cpp

include $(BUILD_SHARED_LIBRARY)

$(call import-module,libBdCore)
$(call import-module,libDebug)

UPDATE:其实,使用一个模块的名称后缀分开构建的配置是,在我眼里,最好的解决办法。 这种方法允许你建立并在同一时间部署多个配置。 举例来说,我使用它时,我必须优化库要么Tegra的(没有霓虹灯)或的Snapdragon(氖):直到最近,这是不容易放置两个独立的APK Play商店,因此我被包装都libv-neon.solibv-tegra.solib/armeabi-v7a

我不知道你的库bootinfo中包括什么逻辑,但如果你只部署一个库,你能避免所有与您的Java类静态构造函数下面的代码的麻烦:

static {
    boolean loaded = false;
    while (!loaded) {
        try {
            System.loadLibrary("game" + nextExtensionAttempt);
            loaded = true;
        } 
        catch (Exception ex) {
        }
    }
}

另一种方法是将覆盖输出目录./obj 。 为了这个目的,可以将下面的行添加到您的Application.mk文件:

NDK_APP_OUT := obj$(MY_BUILD_EXTENSION)

这样所有.obj.a.so文件(它们被安装到前libs/armeabi )将被放置在每个配置一个单独的目录。 更容易,你可以提供NDK_OUT on参数ndk-build的命令行,如

ndk-build V=1 NDK_OUT=obj${MY_BUILD_EXTENSION}

如果你使用Eclipse,以保持并选择配置,这是很容易的。 这很容易让Java来加载模块,因为它总是具有相同的名称。 但是,你只能在同一时间部署单一的配置。



Answer 2:

我从来没有能够得到这个工作完全正确。 最后我刚刚创建,其写了一个空的源文件的批处理文件。 该批处理文件作为Eclipse的一个构建步骤的一部分执行。 那么我认为包括源文件为我的图书馆的一部分。 由于时间戳改变每次我建的时候,它的技巧NDK为每次重建该库。 我要确保库保持很小,最代码存在于其他库,使建造时间很短。



文章来源: Android NDK - Force library rebuild on configuration change