在 Android 中使用 RPC 的标准方法是什么?在 Android 中进行 RPC 的官方方式对我来说似乎是 AIDL。那是对的吗?
首先,我对Android很陌生。但开始是好的。我正在热身我已经从 Java 中了解的功能。现在我想更进一步,在我现有的一些 Java 软件中使用一些高级技术。
这是场景。我有一个小的 Java 服务器,它运行一个名为 SIMON 的面向对象的 RPC 版本。现在我想把它和安卓结合起来。意味着在 Android 设备上我想运行一个小应用程序作为客户端,从我的服务器获取其信息。
我阅读了一些说明来为 android 编写客户端和服务器。但是两者都在我不想运行的 android 上运行。
有人知道如何在Android和Java之间结合RPC吗?也许我可以搜索的一些链接或提示应该可以解决问题。现在我有点迷茫,把这两个世界结合起来。
我已经遇到过 REST、JSON、XML-RPC、SOAP,他们需要我不想使用的外部库。我想坚持使用 Android 的标准方式来保持它的“原始”Android。任何。纯Android代码是我在这个阶段的目标。
我将以下代码写入名为 的文件中main.cpp。\n它涉及标准类型的奇怪的重复模板模式 (CRTP) std::variant。
#include <string>\n#include <variant>\n#include <vector>\n\ntemplate<typename T>\nstruct either {\n std::vector<T> arg;\n};\n\ntemplate<typename T>\nstruct maybe_either: std::variant<T, either<maybe_either<T>>> {\n\n template<typename U>\n maybe_either(U&& v):\n std::variant<T, either<maybe_either<T>>>(std::forward<U>(v)) {\n }\n};\n\nstruct var {\n std::string name;\n};\n\nint main(int, char**) {\n auto expression = maybe_either<var>(either<maybe_either<var>>{});\n std::visit([&](auto&& v) {\n using T = std::decay_t<decltype (v)>;\n if constexpr (std::is_same_v<T, var>) {\n // ...\n } else if constexpr (std::is_same_v<T, either<maybe_either<var>>>) {\n // ...\n }\n }, expression);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n当使用以下命令行编译它时,我收到以下错误消息:
\n$ g++ -c -std=c++17 main.cpp\nIn file included …Run Code Online (Sandbox Code Playgroud) 我在公共公关中遇到了一个有趣的变化。最初他们有:
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
pub struct ParseError(ParseErrorKind);
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
enum ParseErrorKind {
OutOfRange // ... omitting other values here to be short
}
Run Code Online (Sandbox Code Playgroud)
ParseError由于是私有的,因此无法由客户端实例化ParseErrorKind。他们现在正在公开这一点enum,这似乎没问题,但我建议了一种替代方案:成为ParseError一个enum自身,并利用类型系统,而不是用“种类”的概念来模仿它。他们告诉我这会导致 API 损坏,因此不行。
我想我明白为什么理论上 astruct和 anenum是不同的。但我不确定为什么它在这种情况下不兼容。
由于struct ParseError没有可变字段并且无法由客户端实例化,因此我们无法对该类型执行任何操作,只能对其进行分配和比较。似乎两者struct都enum支持这一点,因此客户端代码不太可能需要更改才能使用公开的新版本enum而不是struct. 或者我是否错过了我们可以使用 的另一种用途struct,这将导致需要更改客户端代码?
但是,也可能存在 ABI 不兼容的情况。Rust 在实践中如何处理struct,因为知道只有库才能构造它?是否有任何类型的分配或释放机制需要ParseError在构建时准确地知道它是由什么组成的?从那个确切的转换struct到enum那个会产生影响吗?或者在这种特殊情况下它是否安全?由于到目前为止还无法保证,这与尝试维持 ABI …