Flutter 上使用 C/C++ 代码(下)

简介: Flutter 上使用 C/C++ 代码(下)

在 Flutter 中使用


接着就要开始在 Flutter 中使用了,和在 dart vm 中使用不一样,不能使用环境变量,而是需要将库置入到项目中。


创建仓库

直接使用 flutter create -t plugin native_add 的方式即可。


cpp 文件

native_add.cpp

#include <stdint.h>
extern "C" {
  // __attribute__((visibility("default"))) __attribute__((used))
  int32_t native_add(int32_t x, int32_t y) { return x + y; }
  double double_add(double x, double y) { return x + y; }
}


dart 文件

final DynamicLibrary dylib = Platform.isAndroid
    ? DynamicLibrary.open("libnative_add.so")
    : DynamicLibrary.open("native_add.framework/native_add");
final int Function(int x, int y) nativeAdd = dylib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
    .asFunction();
final double Function(double, double) doubleAdd = dylib
    .lookup<NativeFunction<Double Function(Double, Double)>>("double_add")
    .asFunction();


界面:


class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter = nativeAdd(_counter, 1);
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            Text(
                "native double value = ${doubleAdd(_counter.toDouble(), _counter.toDouble())}"),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}


iOS

iOS 中,直接将 cpp 文件置入 ios/classes 文件夹内即可,然后因为 podspec 中包含默认配置的原因,这个文件会被自动引入项目。

s.source_files = 'Classes/**/*'

运行项目:


image.png

image.png


Android

Android 中其实有两种方法,一是用传统的 ndk 方式,就是 Android.mk 那种方案,我们略过这种方案,因为配置比较复杂,我们使用第二种方案,官方推荐的 CMake 方案。 因为 iOS 中,文件被置入源码中,我这里直接使用相对路径去引入这个文件。


CMakeLists.txt


cmake_minimum_required(VERSION 3.4.1)  
# for example
add_library( native_add
    # Sets the library as a shared library.
    SHARED
    # Provides a relative path to your source file(s).
    ../ios/Classes/native_add.cpp )


  1. 指定源码对应的库是哪个库。


  1. 指定库的类型,这里是动态库,所以用 SHARED。


  1. 指定源码目录。


然后因为我们使用了 cmake,为了让安卓项目知道,我们需要修改 gradle 文件。

android{
    // ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

这里在 Android 节点下,添加属性即可,这里是指定 CMake 使用的文件。


简单总结


现在 ffi 处于初始阶段,还有诸多不足。比如,文档的缺失,现在如何传递字符串,数组都是问题,虽然有结构体的定义,也能看到部分说明,但没有简单的示例帮助开发者快速使用。只有基本数据类型,目前可能还不需要借用 c 来解决,未来则要看 ffi 会开放到什么程度。


后记



目录
相关文章
|
6月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
496 0
|
3月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
90 4
|
4月前
|
存储 开发框架 开发者
flutter:代码存储&基本组件 (五)
本文档介绍了Flutter中的一些基本组件和代码示例,包括代码存储、基本组件如AppBar的简单使用、可滑动切换的标签栏、TextField的多种用法(如简单使用、登录页面、文本控制器的监听与使用、修饰等),以及如何实现点击空白区域隐藏键盘等功能。通过这些示例,开发者可以快速掌握在Flutter应用中实现常见UI元素的方法。
|
4月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
632 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
5月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
4月前
|
IDE 调度 开发工具
鸿蒙Flutter实战:08-如何调试代码
本文介绍了鸿蒙Flutter项目的开发环境搭建、配置、日志查看及调试方法。首先按照指南搭建开发环境,安装IDE插件;接着配置vscode的launch.json文件;通过IDE调试控制台或命令行查看日志;提供两种调试Flutter的方式,包括IDE直接运行和使用DevEco;最后介绍ArkTs和Webview的调试方法。
113 0
|
4月前
|
小程序 Java Android开发
flutter:注意点&快速代码&链接虚拟机&改配置 (一)
这段内容主要介绍了Flutter开发中的一些注意事项和快速代码示例。首先,在构建Flutter小程序时,`setState`方法只能在`StatefulWidget`和`State`类中使用,且初始化数据应放在`initState`方法内。接着,通过一个简单的示例展示了如何构建一个包含`Scaffold`的基本Flutter应用,并指出了在`MaterialApp`中移除调试横幅的方法。此外,文档还提供了关于搭建Flutter开发环境、配置虚拟机、解决安装错误以及配置相关文件(如`build.gradle`)的指导信息。
|
5月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
5月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
5月前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
111 0

热门文章

最新文章