在 gradle sync android studio 上跳过 prebuilt-library.mk

skip prebuilt-library.mk on gradle sync android studio

我的项目应用程序依赖于库模块 alib。 app 和 alib 都使用 ndk 构建了一个 c++ 库。名为 app.so 的应用程序 C++ 库依赖于 alib.so,这是库模块的 C++ 库。在应用程序的 android.mk 中,我有:

LOCAL_PATH := $(the_right_alib_path)
include $(CLEAR_VARS)

LOCAL_MODULE := alibsdk
LOCAL_SRC_FILES := libalib.so
include $(PREBUILT_SHARED_LIBRARY)

Gradle 同步在预构建-library.mk 上失败,消息为 Android NDK:检查 /the_right_alib_path/libalib.so 是否存在或其路径是否正确。

如果我使用 gradle 构建模块,该文件将在那里,当我执行 gradle 同步时,它自然不在那里。

如何跳过prebuilt-library.mk的执行? 或者,有一种方法可以告诉 ndk alib.so 将由另一个 gradle 模块构建?

Ps。这更烦人,因为实际上它会检查所有库的不同 versions/flavor/dimensions,而且我不需要构建所有这些库来处理应用程序的开发版本。

您可以通过对 Android.mk:

的小修改来避免错误
include $(CLEAR_VARS) 
LOCAL_MODULE := alibsdk
LOCAL_SRC_FILES := libalib.so
ifeq ($(findstring n,$(MAKEFLAGS)),n)
  include $(BUILD_SHARED_LIBRARY)
else
  include $(PREBUILT_SHARED_LIBRARY)
endif

这利用了在 sync 期间传递给 ndk-build-n 标志。如果您愿意,可以为此创建自定义定义。 build-shared-library.mk 将生成关于奇怪 SRC 的警告,但不会失败。

同样可以在不触及 Android.mk 文件的情况下实现:在你的 build.gradle 中,使用

if (project.gradle.startParameter.taskNames.isEmpty()
 || project.gradle.startParameter.taskNames[0].contains(":generate")) {
  android.defaultConfig.externalNativeBuild.ndkBuild.arguments += 'PREBUILT_SHARED_LIBRARY=$(BUILD_SHARED_LIBRARY)'
}

Android Studio 多次运行 ndk-build:没有任务(Sync 步骤),在 :generate[flavor][Debug|Release]Sources,并在 :externalNativeBuild[flavor][Debug|Release].

为了检索当前任务,我按照.

也许最简单的解决方法是依赖 prebuilt-library.mk*) 的模糊实现细节。在您的主 Android.mk 的早期,添加行

override prebuilt=$(if $(strip $(wildcard $(prebuilt_path))),$(prebuilt_path),.)

这可以在 gradle 中完成,如有必要:

android.defaultConfig.externalNativeBuild.ndkBuild {
   arguments 'prebuilt=$(if $(strip $(wildcard $(prebuilt_path))),$(prebuilt_path),.)'
}

*) 已针对 NDK r19b 及更早版本进行验证。