最近在研究flutter如何绕过原生端直接调用c++的函数库,在flutter2版本官方提供了比较稳定的FFI(外部功能接口),下面是最基本的用法:
1.创建一个用于flutter调用的c++文件,文件名为cout.c++,文件里面有一个count方法
extern "C" __attribute__((visibility("default"))) __attribute__((used))
int count(int32_t x, int32_t y){
return x+y;
}
2.将写好的c++文件放在IOS/Classes文件夹下(至于为什么要放在这里,网上很多博客都是固定放在这个位置,至于能不能放在其他位置,以后再研究)。
3.在android目录下创建CMakeLists.txt文件,把所有需要调用的c++文件通过add_library导入,这里导入刚才写好的cout.c++。
add_library( cout //库名称
SHARED //模式:动态库
../ios/Classes/cout.cpp //文件路径,还需要添加其他文件换行即可;
)
4.在android/app目录下的build.gradle文件里配置CMakelists。
android {
externalNativeBuild {
cmake {
path "../CMakeLists.txt"
}
}
}
5.经过上面4步所需要调用的c++库已经导入进我们的flutter项目了,接下来就是在flutter端调用c++库里面的函数。
import 'dart:io';
import 'package:flutter/material.dart';
final DynamicLibrary ffiLib = Platform.isAndroid ? DynamicLibrary.open('libcout.so') : DynamicLibrary.process();
final int Function(int x, int y) nativeAdd =
ffiLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>("count")
.asFunction();
int a = nativeAdd(3,2);
print(a);
输出结果:
I/flutter ( 6975): 5