美文网首页
FFI 最简示例

FFI 最简示例

作者: tommy_yong | 来源:发表于2023-06-18 11:31 被阅读0次

    新建native_add.cpp文件,位于ios/Runner

    dart:ffi 只允许和 C 符号进行绑定,因此如果是 C++ 编写的符号,需要添加 extern C 标记。另外,还应该添加属性来表明符号是被 Dart 引用的,这样可以防止链接器在优化链接时会丢弃符号,这里说的属性就是上面的 __attribute__((visibility("default"))) __attribute__((used))

    #include <stdint.h>

    extern "C" __attribute__((visibility("default"))) __attribute__((used))

    int32_t native_add(int32_t x, int32_t y) {

        return x + y;

    }

    Android 平台配置

    在 Android 中,需要在创建一个CMakeLists.txt文件用来定义如何编译源文件,同时告诉 Gradle 如何去定位它们。

    首先,在android/app目录中,创建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/Runner/native_add.cpp )

    然后,打开android/app/build.gradle文件,添加以下内容:

    android {

    // ...

        externalNativeBuild {

            // Encapsulates your CMake build configurations.

            cmake {

              // Provides a relative path to your CMake build script.

              path "CMakeLists.txt"

            }

        }

        // ...

    }

    Dart 中调用 C API

    import 'package:flutter/material.dart';

    import 'dart:ffi'; // For FFI

    import 'dart:io'; // For Platform.isX

    void main() {

    runApp(FFIDemo());

    }

    class FFIDemoextends StatefulWidget {

    @override

      _FFIDemoStatecreateState() =>_FFIDemoState();

    }

    class _FFIDemoStateextends State {

    late DynamicLibrarynativeAddLib;

      late int Function(int x, int y)nativeAddFunc;

      @override

      void initState() {

    super.initState();

        //加载 C 符号

        nativeAddLib = Platform.isAndroid

            ?DynamicLibrary.open("libnative_add.so")

    :DynamicLibrary.process();

        //查找"native_add"符号,并转为 Dart 函数

        nativeAddFunc =nativeAddLib

            .lookup>("native_add")

    .asFunction();

      }

    @override

      Widgetbuild(BuildContext context) {

    return MaterialApp(

    home:Center(

    child:Text(

    "1+1=${nativeAddFunc(1, 1)}", //调用 C 的 native_add() 函数

            ),

          ),

        );

      }

    }

    相关文章

      网友评论

          本文标题:FFI 最简示例

          本文链接:https://www.haomeiwen.com/subject/wxnjydtx.html