在 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 及更早版本进行验证。
我的项目应用程序依赖于库模块 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 及更早版本进行验证。