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