FFI 最简示例

新建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() 函数

        ),

      ),

    );

  }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容