使用 Platform Channels 在 Flutter 中调用原生库

Posted

技术标签:

【中文标题】使用 Platform Channels 在 Flutter 中调用原生库【英文标题】:Calling native libraries in Flutter using Platform Channels 【发布时间】:2018-10-05 19:36:18 【问题描述】:

使用platform channels,Flutter 可以与原生平台互操作(即读取电池电量)。在 android 上,这需要调用 Java 方法。

我想使用第三方 Java 开发工具包(适用于 AWS Cognito)。我可以把这个库放在我的/android 的某个地方,并与之交互吗?如果是这样,我该怎么做?

【问题讨论】:

【参考方案1】:

是的,你可以。

您可以在上面看到documentation,或者如果您愿意,您可以看到 tutorial。如果您使用的 SDK 可以为您提供 Android 和 ios 的原生代码,否则会很困难。 祝你好运!

【讨论】:

谢谢!非常有帮助,应该是公认的答案【参考方案2】:

如果您还没有启动插件项目,请创建一个。

在某处收集第三方 jar - 不要将它们放在 pluginproject/android/... 文件夹中。

在您的 IDE 中打开插件项目 - 在我的例子中是 IDEA - 并将第三方 jars 添加到 Java 类路径中。 (在 IDEA 中,单击 Project Structure / Modules / 选择 pluginName_android / Dependencies 选项卡 / 绿色 PlusSign / jars 或目录 - 并选择单个 jars 或整个文件夹。将范围保留为 compile 并且不要检查导出。)

pluginproject/android/src/main/java/com/yourcompany.../... 中用 Java(或 Kotlin)实现您的 android 特定代码/PluginnamePlugin.java,您现在可以在其中使用第三方 jar 声明的类。

将依赖项添加到 gradle 以便它可以编译。在 pluginproject/android/build.gradle 中(注意 - 有几个 build.gradle)在最后添加这个 - 在 android 部分之后

dependencies 
    implementation files('../../../java/someapi/somejar.jar')

路径必须相对于 pluginproject/android 文件夹。您可以改为使用此语法指定整个文件夹

implementation fileTree(dir: '../../../somewhere/somefolder', include: ['*.jar'])

运行插件项目中提供的示例应用程序。

我不确定为什么不能将第三方 jars 放入,例如 pluginproject/android/lib,但这会导致我的 dex 错误,而将它们留在外面pluginproject/ 文件夹有效。

我只使用过行为良好的第三方 jar(没有 JNI,不创建自己的线程等)。

【讨论】:

除非我将依赖项添加到 android/app/build.gradle 而不是 android/build.gradle,否则我没有让实现工作 您好,请问您可以为此制作视频吗?我想使用 iText,但我不清楚 :(【参考方案3】:

flutter 的 Android 端使用 Gradle(与任何其他 android 项目相同)。如果你有一个现有的 android 应用程序,你可能可以从你的 gradle 文件中移植大部分相同的设置。

除非您已经这样做并且拥有管理 jar 的系统,否则我不建议将 jar 文件直接复制到您的项目中并因此进行源代码管理。

改为使用 gradle 的内置依赖解析。你应该可以关注Amazon's android sdk set-up directions。不同之处在于您必须通过方法通道连接对 SDK 的调用并编写自己的互操作代码。

【讨论】:

以上是关于使用 Platform Channels 在 Flutter 中调用原生库的主要内容,如果未能解决你的问题,请参考以下文章

Django Channels 是不是使用 ws:// 协议前缀在 Django 视图或 Channels 应用程序之间进行路由?

Flutter混编工程之通讯之路

Flutter混编工程之通讯之路

Flutter混编工程之通讯之路

如何在 pyFltk 中使用 Fl_Tabs

如何在 FLTK 库中使用 Fl::awake