reverseArray function

Future<List<int>> reverseArray(
  1. List<int> input
)

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;
}