Android 用于桌面的flatter插件是否必须使用特定于平台的语言编写(例如windows我们使用C+;+;和mac我们使用Swift)

Android 用于桌面的flatter插件是否必须使用特定于平台的语言编写(例如windows我们使用C+;+;和mac我们使用Swift),android,windows,flutter,dart,Android,Windows,Flutter,Dart,大家好 我对飞镖和飞镖还不熟悉,希望能得到更多帮助 我有一个flatter插件,它目前在android目录中用Java编写。我希望相同的插件能够在其他平台上运行,如windows和mac。我必须在C++中为Windows和SWIFT重新编写Mac OS的插件,或者我可以在这些目录中使用java文件。p> 如果我可以使用相同的Java文件,请有人告诉我如何将这些文件移动到其他目录,以及我需要为我的Flatter应用程序执行哪些操作才能为其他平台获取这些插件。在macos中似乎不可能使用Java代码

大家好

我对飞镖和飞镖还不熟悉,希望能得到更多帮助

我有一个flatter插件,它目前在android目录中用Java编写。我希望相同的插件能够在其他平台上运行,如windows和mac。我必须在C++中为Windows和SWIFT重新编写Mac OS的插件,或者我可以在这些目录中使用java文件。p>
如果我可以使用相同的Java文件,请有人告诉我如何将这些文件移动到其他目录,以及我需要为我的Flatter应用程序执行哪些操作才能为其他平台获取这些插件。

macos
中似乎不可能使用Java代码

为了添加对例如
macosx
的支持,您应该创建一个名为
macos
的目录,并在
swift
中编写插件

有关这方面的更多信息,请查看此处:


(2020年2月29日)Windows和Linux支持目前正在技术预览中

macos
中似乎不可能使用Java代码

为了添加对例如
macosx
的支持,您应该创建一个名为
macos
的目录,并在
swift
中编写插件

有关这方面的更多信息,请查看此处:


(2020年2月29日)Windows和Linux支持目前正在技术预览中,您想做的具体事情可能无法正常工作,原因有两个:

  • 桌面平台上的flatter应用程序没有javavm,因此不能使用Java
  • 颤振插件通常用于调用特定于平台的功能(或为特定平台编写的第三方SDK,但效果相同)。例如,如果你考虑一个插件,比如“代码>相机<代码>,即使你忽略了语言问题,也不能把Android相机API称为Mac OS或Windows,因为它们不是Android;他们有完全不同的操作系统摄像头API。(也有一些例外,如
    sqflite
    ,它们包装了一个已经跨平台的库,但这并不是标准)
但是,对于您是否必须使用文档中描述的特定语言的一般问题,从技术上来说,答案是否定的:

  • 在Windows和Linux上,插件(目前)只是具有特定C接口的共享库。理论上,你可以用任何可以编译成C兼容的共享库的语言来编写整个插件,比如Go或Rust(尽管你必须自己做通道编码/解码)。另外,您可以使用C++ API作为一个薄的胶层来处理平台通道,并调用编译为C兼容形式的底层代码。
  • 在macOS上,插件是一个模块,因此外层必须是Swift或Objective-C。然而,Objective-C与C兼容,因此在Objective-C中只使用channel glue方法,在任何带有C接口的东西中使用其余代码的选项同样适用于macOS

然而,除非您正在处理现有的跨平台库,否则这可能不是一个好主意。如果您正在编写的新代码不是特定于平台的,用于Flatter,那么您最好只将其作为常规软件包在Dart中编写,在Dart中,它将在所有当前和未来的Flatter平台上运行。

可能有两个原因导致您想做的特定事情不起作用:

  • 桌面平台上的flatter应用程序没有javavm,因此不能使用Java
  • 颤振插件通常用于调用特定于平台的功能(或为特定平台编写的第三方SDK,但效果相同)。例如,如果你考虑一个插件,比如“代码>相机<代码>,即使你忽略了语言问题,也不能把Android相机API称为Mac OS或Windows,因为它们不是Android;他们有完全不同的操作系统摄像头API。(也有一些例外,如
    sqflite
    ,它们包装了一个已经跨平台的库,但这并不是标准)
但是,对于您是否必须使用文档中描述的特定语言的一般问题,从技术上来说,答案是否定的:

  • 在Windows和Linux上,插件(目前)只是具有特定C接口的共享库。理论上,你可以用任何可以编译成C兼容的共享库的语言来编写整个插件,比如Go或Rust(尽管你必须自己做通道编码/解码)。另外,您可以使用C++ API作为一个薄的胶层来处理平台通道,并调用编译为C兼容形式的底层代码。
  • 在macOS上,插件是一个模块,因此外层必须是Swift或Objective-C。然而,Objective-C与C兼容,因此在Objective-C中只使用channel glue方法,在任何带有C接口的东西中使用其余代码的选项同样适用于macOS

然而,除非您正在处理现有的跨平台库,否则这可能不是一个好主意。如果您正在编写非特定于平台的新代码以用于Flutter,那么您最好只将其作为常规包在Dart中编写,它将在所有当前和未来的Flitter平台上工作。

因此,没有办法将Java文件移动到macos目录中。官方文档中没有提到,因此,我预计Flatter Engine不会在
macos
目录中编译Java代码。如果你想在任何地方都使用某个东西,可能你可以做的事情是这个ffi,这将是我的下一个选择,如果我可以将Java文件移到macos目录中,就没有办法了在办公室的任何地方