首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Bazel和j2objc在iOS和Android之间共享代码

使用Bazel和j2objc在iOS和Android之间共享代码
EN

Stack Overflow用户
提问于 2018-06-07 21:01:15
回答 1查看 284关注 0票数 1

我有一个包含常用代码的库,它使用android.util.Log

代码语言:javascript
复制
java_library(
    name = "common",
    srcs = glob(["*.java"]),
)

我有一个适用于iOS的j2objc规则,它工作得很好:

代码语言:javascript
复制
j2objc_library(
    name = "common_ios",
    deps = ["//common"],
    jre_deps = ["@bazel_j2objc//:android_util_lib"],
)

但是当我在我的安卓项目中使用common时:

代码语言:javascript
复制
android_binary(
    name = "app",
    srcs = glob(["*.java"]),
    manifest = "//android:manifest",
    resource_files = ["//android:resources"],
    deps = ["//common"],
)

但是当我运行bazel build //android:app时,我得到:

代码语言:javascript
复制
common/MyVeryOwnLogger.java:3: error: package android.util does not exist
import android.util.Log;

这是有道理的,因为android.*库不应该在java_library规则中可用。我是不是遗漏了什么?这不是设置项目的推荐方式吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-06-08 03:10:22

java_library不能编译依赖于安卓的代码,因为它不会有android_library提供的任何安卓依赖。

您是否尝试过在依赖于使用安卓类的common的情况下运行iOS应用程序?我有点惊讶,它居然还能用。

在任何情况下,我都建议将依赖于平台的东西从common移到特定于平台的规则中。

例如,假设您在common中有某种需要记录器业务逻辑Model类,在common中创建像Logger这样的接口,并让Model获取Logger的一个实例。然后,您可以拥有一个依赖于commonandroid_library规则,并提供一个使用android.util.*中所有类的Logger for Android实现。那么您的android_binary规则取决于commonandroid_library。在您的应用程序代码中,您可以实例化特定于Android的记录器的实例,并将其传递给Model

对于iOS的一半内容,您可以类似地使用objective-c规则来提供特定于iOS的日志记录(尽管我不太熟悉objective-c或iOS中的所有内容是如何工作的)。

您还可以考虑将common拆分成单独的规则,这将提高增量(例如,将日志放入其自己的规则中)。这完全取决于代码的结构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50741921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档