【问题标题】:skip prebuilt-library.mk on gradle sync android studio在 gradle sync android studio 上跳过 prebuilt-library.mk
【发布时间】:2018-04-23 15:47:17
【问题描述】:

我的项目应用程序依赖于库模块 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)

prebuilt-library.mk 上的 Gradle 同步失败,并显示消息 Android NDK: Check that /the_right_alib_path/libalib.so 存在或其路径是否正确。

如果我用 gradle 构建模块,文件就会在那里,当我做 gradle 同步时它自然不在那里。

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

附言。这是更烦人的原因,实际上它会检查所有库的不同版本/风味/尺寸,我不需要构建所有这些库来处理应用程序的开发版本。

【问题讨论】:

  • 关于你的 PS,试试这个 lifehack:groups.google.com/d/msg/android-ndk/1GI1_zjWNAs/MCPWtJv4CQAJ
  • 感谢 Alex 的建议,作为一种解决方法,我目前在控制台上使用 touch 命令来伪造库的存在。其他要补充的是,我可以从命令行使用 gradle 编译。问题在于 Android Studio 上的 gradle 同步。

标签: android c++ android-studio gradle ndk-build


【解决方案1】:

您可以通过对 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] 内来源,以及内:externalNativeBuild[flavor][Debug|Release]

为了检索当前任务,我关注了https://stackoverflow.com/a/21603707/192373

也许最简单的解决方法是依赖 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 及更早版本进行了验证。

【讨论】:

  • 所有解决方案都有效(我必须将第二个和第三个 android.externalNativeBuild.ndkBuild.arguments 更改为参数并复制 defaultConfig->externalNativeBuild->ndkBuild 上的 sn-p)。谢谢!
  • 感谢您的指正,defaultConfig 在复制/粘贴中迷路了!
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 2021-07-12
  • 1970-01-01
  • 2015-07-25
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多