reverseArray function
Implementation
Future<List<int>> reverseArray(List<int> input) async {
// 为输入数组在 C 堆上分配内存
final inputPtr = calloc<ffi.Int32>(input.length);
for (int i = 0; i < input.length; i++) {
inputPtr.elementAt(i).value = input[i];
}
// 动态加载库
// final dylib = ffi.DynamicLibrary.open('assets/libreverse_array.dylib');
// final dylib = ffi.DynamicLibrary.open('assets/libZygGetKeyJNI.so');
// final dylib = ffi.DynamicLibrary.open('libwxxcjiajia.so');
if (reverseArrayFunc == null) {
// packages/my_plugin/assets/asset_name
final data = await rootBundle
.load('packages/zyg_flutter_plugin/lib/assets/libZygGetKeyJNI.so');
// final data = await rootBundle.load('assets/libZygGetKeyJNI.so');
final bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
final tempDir = await getTemporaryDirectory();
final tempFilePath = '${tempDir.path}/libZygGetKeyJNI.so';
final file = File(tempFilePath);
await file.writeAsBytes(bytes);
final dylib = ffi.DynamicLibrary.open(file.path);
// 获取函数指针
reverseArrayFunc = dylib
.lookup<ffi.NativeFunction<ReverseArrayNative>>('reverseArrayC')
.asFunction<
void Function(ffi.Pointer<ffi.Int32>, int,
ffi.Pointer<ffi.Pointer<ffi.Int32>>, ffi.Pointer<ffi.Size>)>();
}
// 为输出数组和输出大小分配内存
final outputPtrPtr = calloc<ffi.Pointer<ffi.Int32>>();
final outputSizePtr = calloc<ffi.Size>();
// 调用原生函数
reverseArrayFunc(inputPtr, input.length, outputPtrPtr, outputSizePtr);
// 从输出指针读取结果
final outputPtr = outputPtrPtr.value;
final outputSize = outputSizePtr.value;
final output = List<int>.generate(outputSize, (i) {
return outputPtr.elementAt(i).value;
});
// 释放所有分配的内存
calloc.free(inputPtr);
calloc.free(outputPtrPtr);
calloc.free(outputSizePtr);
// 如果 C 函数分配了新的内存给输出数组,也需要释放它
calloc.free(outputPtr);
return output;
}