diff --git a/pkgs/ffigen/.github/workflows/test-package.yml b/pkgs/ffigen/.github/workflows/test-package.yml
index 3c4d535..8da431d 100644
--- a/pkgs/ffigen/.github/workflows/test-package.yml
+++ b/pkgs/ffigen/.github/workflows/test-package.yml
@@ -19,7 +19,7 @@
     strategy:
       fail-fast: false
       matrix:
-        sdk: [2.14.0]
+        sdk: [2.16.0-124.0.dev] # TODO(#262)
     steps:
       - uses: actions/checkout@v2
       - uses: dart-lang/setup-dart@v1.0
@@ -43,7 +43,7 @@
       - uses: actions/checkout@v2
       - uses: dart-lang/setup-dart@v1.0
         with:
-          sdk: 2.14.0
+          sdk: 2.16.0-124.0.dev # TODO(#262)
       - name: Install dependencies
         run: dart pub get
       - name: Install libclang-10-dev
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md
index 73861a3..fd75d43 100644
--- a/pkgs/ffigen/CHANGELOG.md
+++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 5.0.0-dev.0
+- Added support for generating ABI Specific integers.
+- Breaking: removed config keys - `size-map` and `typedef-map`.
+- Added config keys - `library-imports` and `type-map`.
+
 # 4.1.3
 - Analyzer fixes.
 
diff --git a/pkgs/ffigen/README.md b/pkgs/ffigen/README.md
index a4439bb..32137b9 100644
--- a/pkgs/ffigen/README.md
+++ b/pkgs/ffigen/README.md
@@ -22,6 +22,7 @@
 ```
 Output (_generated_bindings.dart_).
 ```dart
+import 'package:ffi/ffi.dart' as pkg_ffi;
 class NativeLibrary {
   final Pointer<T> Function<T extends NativeType>(String symbolName)
       _lookup;
@@ -36,12 +37,13 @@
     return _sum(a, b);
   }
 
-  late final _sumPtr = _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32, ffi.Int32)>>('sum');
+  late final _sumPtr = _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int, pkg_ffi.Int)>>('sum');
   late final _sum = _sum_ptr.asFunction<int Function(int, int)>();
 }
 ```
 ## Using this package
 - Add `ffigen` under `dev_dependencies` in your `pubspec.yaml` (run `dart pub add -d ffigen`).
+- Add `package:ffi` under `dependencies` in your `pubspec.yaml` (run `dart pub add ffigen`).
 - Install LLVM (see [Installing LLVM](#installing-llvm)).
 - Configurations must be provided in `pubspec.yaml` or in a custom YAML file (see [configurations](#configurations)).
 - Run the tool- `dart run ffigen`.
@@ -385,7 +387,7 @@
   </tr>
   <tr>
     <td>use-supported-typedefs</td>
-    <td>Should automatically map typedefs, E.g uint8_t => Uint8, int16_t => Int16 etc.<br>
+    <td>Should automatically map typedefs, E.g uint8_t => Uint8, int16_t => Int16, size_t => Size etc.<br>
     <b>Default: true</b>
     </td>
     <td>
@@ -431,43 +433,54 @@
 </td>
   </tr>
   <tr>
-    <td>typedef-map</td>
-    <td>Map typedefs to Native Types.<br> Values can only be
-    <i>Void, Uint8, Int8, Uint16, Int16, Uint32, Int32, Uint64, Int64, IntPtr, Float and Double.</i>
+    <td>library-imports</td>
+    <td>Specify library imports for use in type-map.<br><br>
+    Note: ffi (dart:ffi) is already available as a predefined import.
     </td>
     <td>
 
 ```yaml
-typedef-map:
-  'my_custom_type': 'IntPtr'
-  'size_t': 'Int64'
+library-imports:
+  custom_lib: 'package:some_pkg/some_file.dart'
 ```
   </td>
   </tr>
   <tr>
-    <td>size-map</td>
-    <td>Size of integers to use (in bytes).<br>
-    <b>The defaults (see example) <i>may</i> not be portable on all OS.
-    Do not change these unless absolutely sure.</b>
+    <td>type-map</td>
+    <td>Map types like integers, typedefs, structs,  unions to any other type.<br><br>
+    <b>Sub-fields</b> - <i>typedefs</i>, <i>structs</i>, <i>unions</i>, <i>ints</i><br><br>
+    <b><i>lib</i></b> must be specified in <i>library-imports</i> or be one of a predefined import.
     </td>
     <td>
 
 ```yaml
-# These are optional and also default,
-# Omitting any and the default
-# will be used.
-size-map:
-  char: 1
-  unsigned char: 1
-  short: 2
-  unsigned short: 2
-  int: 4
-  unsigned int: 4
-  long: 8
-  unsigned long: 8
-  long long: 8
-  unsigned long long: 8
-  enum: 4
+type-map:
+  'native-types': # Targets native types.
+    'char':
+      'lib': 'pkg_ffi' # predefined import.
+      'c-type': 'Char'
+      # For native-types dart-type can be be int, double or float
+      # but same otherwise.
+      'dart-type': 'int'
+    'int':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType4'
+      'dart-type': 'int'
+  'typedefs': # Targets typedefs.
+    'my_type1':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType'
+      'dart-type': 'CustomType'
+  'structs': # Targets structs.
+    'my_type2':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType2'
+      'dart-type': 'CustomType2'
+  'unions': # Targets unions.
+    'my_type3':
+      'lib': 'custom_lib'
+      'c-type': 'CustomType3'
+      'dart-type': 'CustomType3'
 ```
   </td>
   </tr>
diff --git a/pkgs/ffigen/analysis_options.yaml b/pkgs/ffigen/analysis_options.yaml
index 002a2c4..06af095 100644
--- a/pkgs/ffigen/analysis_options.yaml
+++ b/pkgs/ffigen/analysis_options.yaml
@@ -5,9 +5,11 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
+  exclude:
+    - 'test/**_expected*'
+  language:
+    strict-casts: true
+    strict-inference: true
 
 linter:
   rules:
diff --git a/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart b/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
index a518d8a..3f5d92e 100644
--- a/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
+++ b/pkgs/ffigen/example/c_json/cjson_generated_bindings.dart
@@ -24,6 +24,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Holds bindings to cJSON.
 class CJson {
@@ -40,15 +41,15 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<ffi.Int8> cJSON_Version() {
+  ffi.Pointer<pkg_ffi.Char> cJSON_Version() {
     return _cJSON_Version();
   }
 
   late final _cJSON_VersionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'cJSON_Version');
   late final _cJSON_Version =
-      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_VersionPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
@@ -65,7 +66,7 @@
       _cJSON_InitHooksPtr.asFunction<void Function(ffi.Pointer<cJSON_Hooks>)>();
 
   ffi.Pointer<cJSON> cJSON_Parse(
-    ffi.Pointer<ffi.Int8> value,
+    ffi.Pointer<pkg_ffi.Char> value,
   ) {
     return _cJSON_Parse(
       value,
@@ -74,13 +75,14 @@
 
   late final _cJSON_ParsePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>>('cJSON_Parse');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_Parse');
   late final _cJSON_Parse = _cJSON_ParsePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
-    ffi.Pointer<ffi.Int8> value,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
+    ffi.Pointer<pkg_ffi.Char> value,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> return_parse_end,
     int require_null_terminated,
   ) {
     return _cJSON_ParseWithOpts(
@@ -93,14 +95,14 @@
   late final _cJSON_ParseWithOptsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               cJSON_bool)>>('cJSON_ParseWithOpts');
   late final _cJSON_ParseWithOpts = _cJSON_ParseWithOptsPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>, int)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_Print(
+  ffi.Pointer<pkg_ffi.Char> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_Print(
@@ -110,11 +112,12 @@
 
   late final _cJSON_PrintPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<cJSON>)>>('cJSON_Print');
   late final _cJSON_Print = _cJSON_PrintPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
+  ffi.Pointer<pkg_ffi.Char> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_PrintUnformatted(
@@ -124,12 +127,12 @@
 
   late final _cJSON_PrintUnformattedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_PrintUnformatted');
   late final _cJSON_PrintUnformatted = _cJSON_PrintUnformattedPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
+  ffi.Pointer<pkg_ffi.Char> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
@@ -143,14 +146,14 @@
 
   late final _cJSON_PrintBufferedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               cJSON_bool)>>('cJSON_PrintBuffered');
   late final _cJSON_PrintBuffered = _cJSON_PrintBufferedPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, int, int)>();
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>, int, int)>();
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
-    ffi.Pointer<ffi.Int8> buffer,
+    ffi.Pointer<pkg_ffi.Char> buffer,
     int length,
     int format,
   ) {
@@ -164,10 +167,10 @@
 
   late final _cJSON_PrintPreallocatedPtr = _lookup<
       ffi.NativeFunction<
-          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, cJSON_bool)>>('cJSON_PrintPreallocated');
+          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int, cJSON_bool)>>('cJSON_PrintPreallocated');
   late final _cJSON_PrintPreallocated = _cJSON_PrintPreallocatedPtr.asFunction<
-      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int, int)>();
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, int, int)>();
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
@@ -192,7 +195,7 @@
   }
 
   late final _cJSON_GetArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<cJSON>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<cJSON>)>>(
           'cJSON_GetArraySize');
   late final _cJSON_GetArraySize =
       _cJSON_GetArraySizePtr.asFunction<int Function(ffi.Pointer<cJSON>)>();
@@ -210,13 +213,13 @@
   late final _cJSON_GetArrayItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_GetArrayItem');
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_GetArrayItem');
   late final _cJSON_GetArrayItem = _cJSON_GetArrayItemPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_GetObjectItem(
       object,
@@ -227,13 +230,14 @@
   late final _cJSON_GetObjectItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItem');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_GetObjectItem');
   late final _cJSON_GetObjectItem = _cJSON_GetObjectItemPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_GetObjectItemCaseSensitive(
       object,
@@ -244,15 +248,15 @@
   late final _cJSON_GetObjectItemCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItemCaseSensitive');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_GetObjectItemCaseSensitive');
   late final _cJSON_GetObjectItemCaseSensitive =
       _cJSON_GetObjectItemCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_HasObjectItem(
       object,
@@ -263,21 +267,21 @@
   late final _cJSON_HasObjectItemPtr = _lookup<
       ffi.NativeFunction<
           cJSON_bool Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_HasObjectItem');
-  late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr
-      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_HasObjectItem');
+  late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr.asFunction<
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
+  ffi.Pointer<pkg_ffi.Char> cJSON_GetErrorPtr() {
     return _cJSON_GetErrorPtr();
   }
 
   late final _cJSON_GetErrorPtrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'cJSON_GetErrorPtr');
   late final _cJSON_GetErrorPtr =
-      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
+  ffi.Pointer<pkg_ffi.Char> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_GetStringValue(
@@ -287,10 +291,10 @@
 
   late final _cJSON_GetStringValuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_GetStringValue');
   late final _cJSON_GetStringValue = _cJSON_GetStringValuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
@@ -491,7 +495,7 @@
       _cJSON_CreateNumberPtr.asFunction<ffi.Pointer<cJSON> Function(double)>();
 
   ffi.Pointer<cJSON> cJSON_CreateString(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_CreateString(
       string,
@@ -501,12 +505,12 @@
   late final _cJSON_CreateStringPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateString');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateString');
   late final _cJSON_CreateString = _cJSON_CreateStringPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<pkg_ffi.Char> raw,
   ) {
     return _cJSON_CreateRaw(
       raw,
@@ -516,9 +520,9 @@
   late final _cJSON_CreateRawPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateRaw');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateRaw');
   late final _cJSON_CreateRaw = _cJSON_CreateRawPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
     return _cJSON_CreateArray();
@@ -541,7 +545,7 @@
       _cJSON_CreateObjectPtr.asFunction<ffi.Pointer<cJSON> Function()>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_CreateStringReference(
       string,
@@ -551,9 +555,9 @@
   late final _cJSON_CreateStringReferencePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateStringReference');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateStringReference');
   late final _cJSON_CreateStringReference = _cJSON_CreateStringReferencePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
@@ -584,7 +588,7 @@
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
-    ffi.Pointer<ffi.Int32> numbers,
+    ffi.Pointer<pkg_ffi.Int> numbers,
     int count,
   ) {
     return _cJSON_CreateIntArray(
@@ -596,9 +600,9 @@
   late final _cJSON_CreateIntArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('cJSON_CreateIntArray');
+              ffi.Pointer<pkg_ffi.Int>, pkg_ffi.Int)>>('cJSON_CreateIntArray');
   late final _cJSON_CreateIntArray = _cJSON_CreateIntArrayPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int32>, int)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Int>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
@@ -613,7 +617,7 @@
   late final _cJSON_CreateFloatArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Float>, ffi.Int32)>>('cJSON_CreateFloatArray');
+              ffi.Pointer<ffi.Float>, pkg_ffi.Int)>>('cJSON_CreateFloatArray');
   late final _cJSON_CreateFloatArray = _cJSON_CreateFloatArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Float>, int)>();
 
@@ -629,13 +633,13 @@
 
   late final _cJSON_CreateDoubleArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Double>, ffi.Int32)>>('cJSON_CreateDoubleArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>,
+              pkg_ffi.Int)>>('cJSON_CreateDoubleArray');
   late final _cJSON_CreateDoubleArray = _cJSON_CreateDoubleArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> strings,
     int count,
   ) {
     return _cJSON_CreateStringArray(
@@ -646,10 +650,11 @@
 
   late final _cJSON_CreateStringArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32)>>('cJSON_CreateStringArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int)>>('cJSON_CreateStringArray');
   late final _cJSON_CreateStringArray = _cJSON_CreateStringArrayPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>, int)>();
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
@@ -670,7 +675,7 @@
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObject(
@@ -682,15 +687,15 @@
 
   late final _cJSON_AddItemToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObject');
   late final _cJSON_AddItemToObject = _cJSON_AddItemToObjectPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObjectCS(
@@ -702,11 +707,11 @@
 
   late final _cJSON_AddItemToObjectCSPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObjectCS');
   late final _cJSON_AddItemToObjectCS = _cJSON_AddItemToObjectCSPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
@@ -727,7 +732,7 @@
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemReferenceToObject(
@@ -739,12 +744,12 @@
 
   late final _cJSON_AddItemReferenceToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemReferenceToObject');
   late final _cJSON_AddItemReferenceToObject =
       _cJSON_AddItemReferenceToObjectPtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
@@ -778,7 +783,7 @@
   late final _cJSON_DetachItemFromArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_DetachItemFromArray');
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_DetachItemFromArray');
   late final _cJSON_DetachItemFromArray = _cJSON_DetachItemFromArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
@@ -793,14 +798,15 @@
   }
 
   late final _cJSON_DeleteItemFromArrayPtr = _lookup<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32)>>(
-      'cJSON_DeleteItemFromArray');
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_DeleteItemFromArray');
   late final _cJSON_DeleteItemFromArray = _cJSON_DeleteItemFromArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObject(
       object,
@@ -811,15 +817,15 @@
   late final _cJSON_DetachItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DetachItemFromObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_DetachItemFromObject');
   late final _cJSON_DetachItemFromObject =
       _cJSON_DetachItemFromObjectPtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObjectCaseSensitive(
       object,
@@ -830,16 +836,16 @@
   late final _cJSON_DetachItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
               ffi.Pointer<cJSON> Function(
-                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+                  ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>>(
       'cJSON_DetachItemFromObjectCaseSensitive');
   late final _cJSON_DetachItemFromObjectCaseSensitive =
       _cJSON_DetachItemFromObjectCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObject(
       object,
@@ -850,13 +856,14 @@
   late final _cJSON_DeleteItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DeleteItemFromObject');
-  late final _cJSON_DeleteItemFromObject = _cJSON_DeleteItemFromObjectPtr
-      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_DeleteItemFromObject');
+  late final _cJSON_DeleteItemFromObject =
+      _cJSON_DeleteItemFromObjectPtr.asFunction<
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObjectCaseSensitive(
       object,
@@ -866,11 +873,12 @@
 
   late final _cJSON_DeleteItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(
+                  ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>>(
       'cJSON_DeleteItemFromObjectCaseSensitive');
   late final _cJSON_DeleteItemFromObjectCaseSensitive =
       _cJSON_DeleteItemFromObjectCaseSensitivePtr.asFunction<
-          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_InsertItemInArray(
     ffi.Pointer<cJSON> array,
@@ -886,7 +894,7 @@
 
   late final _cJSON_InsertItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_InsertItemInArray');
   late final _cJSON_InsertItemInArray = _cJSON_InsertItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
@@ -926,14 +934,14 @@
 
   late final _cJSON_ReplaceItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInArray');
   late final _cJSON_ReplaceItemInArray = _cJSON_ReplaceItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObject(
@@ -945,16 +953,16 @@
 
   late final _cJSON_ReplaceItemInObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObject');
   late final _cJSON_ReplaceItemInObject =
       _cJSON_ReplaceItemInObjectPtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObjectCaseSensitive(
@@ -966,12 +974,12 @@
 
   late final _cJSON_ReplaceItemInObjectCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObjectCaseSensitive');
   late final _cJSON_ReplaceItemInObjectCaseSensitive =
       _cJSON_ReplaceItemInObjectCaseSensitivePtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
@@ -1010,7 +1018,7 @@
       .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<cJSON>, int)>();
 
   void cJSON_Minify(
-    ffi.Pointer<ffi.Int8> json,
+    ffi.Pointer<pkg_ffi.Char> json,
   ) {
     return _cJSON_Minify(
       json,
@@ -1018,14 +1026,14 @@
   }
 
   late final _cJSON_MinifyPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<pkg_ffi.Char>)>>(
           'cJSON_Minify');
   late final _cJSON_Minify =
-      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddNullToObject(
       object,
@@ -1036,13 +1044,14 @@
   late final _cJSON_AddNullToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddNullToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddNullToObject');
   late final _cJSON_AddNullToObject = _cJSON_AddNullToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddTrueToObject(
       object,
@@ -1053,13 +1062,14 @@
   late final _cJSON_AddTrueToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddTrueToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddTrueToObject');
   late final _cJSON_AddTrueToObject = _cJSON_AddTrueToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddFalseToObject(
       object,
@@ -1070,13 +1080,14 @@
   late final _cJSON_AddFalseToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddFalseToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddFalseToObject');
   late final _cJSON_AddFalseToObject = _cJSON_AddFalseToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     int boolean,
   ) {
     return _cJSON_AddBoolToObject(
@@ -1088,15 +1099,15 @@
 
   late final _cJSON_AddBoolToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              cJSON_bool)>>('cJSON_AddBoolToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>, cJSON_bool)>>('cJSON_AddBoolToObject');
   late final _cJSON_AddBoolToObject = _cJSON_AddBoolToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     double number,
   ) {
     return _cJSON_AddNumberToObject(
@@ -1108,16 +1119,18 @@
 
   late final _cJSON_AddNumberToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Double)>>('cJSON_AddNumberToObject');
   late final _cJSON_AddNumberToObject = _cJSON_AddNumberToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, double)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, double)>();
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> name,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_AddStringToObject(
       object,
@@ -1128,16 +1141,18 @@
 
   late final _cJSON_AddStringToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddStringToObject');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddStringToObject');
   late final _cJSON_AddStringToObject = _cJSON_AddStringToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<pkg_ffi.Char> name,
+    ffi.Pointer<pkg_ffi.Char> raw,
   ) {
     return _cJSON_AddRawToObject(
       object,
@@ -1148,15 +1163,17 @@
 
   late final _cJSON_AddRawToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddRawToObject');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddRawToObject');
   late final _cJSON_AddRawToObject = _cJSON_AddRawToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddObjectToObject(
       object,
@@ -1167,13 +1184,14 @@
   late final _cJSON_AddObjectToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddObjectToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddObjectToObject');
   late final _cJSON_AddObjectToObject = _cJSON_AddObjectToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddArrayToObject(
       object,
@@ -1184,9 +1202,10 @@
   late final _cJSON_AddArrayToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddArrayToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddArrayToObject');
   late final _cJSON_AddArrayToObject = _cJSON_AddArrayToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
@@ -1214,7 +1233,7 @@
   }
 
   late final _cJSON_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Size)>>(
           'cJSON_malloc');
   late final _cJSON_malloc =
       _cJSON_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1241,30 +1260,31 @@
 
   external ffi.Pointer<cJSON> child;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int type;
 
-  external ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<pkg_ffi.Char> valuestring;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int valueint;
 
   @ffi.Double()
   external double valuedouble;
 
-  external ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<pkg_ffi.Char> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>> malloc_fn;
+          ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Size)>>
+      malloc_fn;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
       free_fn;
 }
 
-typedef cJSON_bool = ffi.Int32;
+typedef cJSON_bool = pkg_ffi.Int;
 
 const int CJSON_VERSION_MAJOR = 1;
 
diff --git a/pkgs/ffigen/example/c_json/pubspec.yaml b/pkgs/ffigen/example/c_json/pubspec.yaml
index e9b7960..f4180fb 100644
--- a/pkgs/ffigen/example/c_json/pubspec.yaml
+++ b/pkgs/ffigen/example/c_json/pubspec.yaml
@@ -8,7 +8,7 @@
   sdk: '>=2.13.0 <3.0.0'
 
 dependencies:
-  ffi: ^1.0.0
+  ffi: ^1.2.0-dev.0
   path: ^1.8.0
 
 dev_dependencies:
@@ -26,8 +26,12 @@
     include-directives:
       - '**cJSON.h'
   comments: false
-  typedef-map:
-    'size_t': 'IntPtr'
+  type-map:
+    typedefs:
+      'size_t':
+        lib: 'pkg_ffi'
+        c-type: 'Size'
+        dart-type: 'int'
 
   preamble: |
     // Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
diff --git a/pkgs/ffigen/example/libclang-example/custom_import.dart b/pkgs/ffigen/example/libclang-example/custom_import.dart
new file mode 100644
index 0000000..df11af4
--- /dev/null
+++ b/pkgs/ffigen/example/libclang-example/custom_import.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
+/// `unsigned long` in C.
+///
+/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint32(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint32(),
+})
+class UnsignedLong extends AbiSpecificInteger {
+  const UnsignedLong();
+}
+
+class CXCursorSetImpl extends Opaque {}
diff --git a/pkgs/ffigen/example/libclang-example/generated_bindings.dart b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
index 1c7c15b..125e78c 100644
--- a/pkgs/ffigen/example/libclang-example/generated_bindings.dart
+++ b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
@@ -9,6 +9,8 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
+import 'custom_import.dart' as custom_import;
 
 /// Holds bindings to LibClang.
 class LibClang {
@@ -26,7 +28,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<pkg_ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -194,7 +196,7 @@
   /// libclang invocations are not logged..
   void clang_CXIndex_setInvocationEmissionPathOption(
     CXIndex arg0,
-    ffi.Pointer<ffi.Int8> Path,
+    ffi.Pointer<pkg_ffi.Char> Path,
   ) {
     return _clang_CXIndex_setInvocationEmissionPathOption(
       arg0,
@@ -290,7 +292,7 @@
   /// or a NULL file handle if the file was not a part of this translation unit.
   CXFile clang_getFile(
     CXTranslationUnit tu,
-    ffi.Pointer<ffi.Int8> file_name,
+    ffi.Pointer<pkg_ffi.Char> file_name,
   ) {
     return _clang_getFile(
       tu,
@@ -312,10 +314,10 @@
   ///
   /// \returns a pointer to the buffer in memory that holds the contents of
   /// \p file, or a NULL pointer when the file is not loaded.
-  ffi.Pointer<ffi.Int8> clang_getFileContents(
+  ffi.Pointer<pkg_ffi.Char> clang_getFileContents(
     CXTranslationUnit tu,
     CXFile file,
-    ffi.Pointer<ffi.IntPtr> size,
+    ffi.Pointer<pkg_ffi.Size> size,
   ) {
     return _clang_getFileContents(
       tu,
@@ -555,9 +557,9 @@
   void clang_getExpansionLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getExpansionLocation(
       location,
@@ -615,8 +617,8 @@
   void clang_getPresumedLocation(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
   ) {
     return _clang_getPresumedLocation(
       location,
@@ -641,9 +643,9 @@
   void clang_getInstantiationLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getInstantiationLocation(
       location,
@@ -684,9 +686,9 @@
   void clang_getSpellingLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getSpellingLocation(
       location,
@@ -727,9 +729,9 @@
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -881,7 +883,7 @@
   /// \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
   /// diagnostics should be released using clang_disposeDiagnosticSet().
   CXDiagnosticSet clang_loadDiagnostics(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<pkg_ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
@@ -1341,9 +1343,9 @@
   /// guarantee their validity until the call to this function returns.
   CXTranslationUnit clang_createTranslationUnitFromSourceFile(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
     int num_clang_command_line_args,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> clang_command_line_args,
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
@@ -1370,7 +1372,7 @@
   /// error codes.
   CXTranslationUnit clang_createTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
   ) {
     return _clang_createTranslationUnit(
       CIdx,
@@ -1392,7 +1394,7 @@
   /// \returns Zero on success, otherwise returns an error code.
   int clang_createTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
     ffi.Pointer<CXTranslationUnit> out_TU,
   ) {
     return _clang_createTranslationUnit2(
@@ -1435,8 +1437,8 @@
   /// error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1503,8 +1505,8 @@
   /// \returns Zero on success, otherwise returns an error code.
   int clang_parseTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1534,8 +1536,8 @@
   /// library paths are relative to the binary.
   int clang_parseTranslationUnit2FullArgv(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1605,7 +1607,7 @@
   /// saved successfully, while a non-zero value indicates that a problem occurred.
   int clang_saveTranslationUnit(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> FileName,
+    ffi.Pointer<pkg_ffi.Char> FileName,
     int options,
   ) {
     return _clang_saveTranslationUnit(
@@ -1736,7 +1738,7 @@
 
   /// Returns the human-readable null-terminated C string that represents
   /// the name of the memory category.  This string should never be freed.
-  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
+  ffi.Pointer<pkg_ffi.Char> clang_getTUResourceUsageName(
     int kind,
   ) {
     return _clang_getTUResourceUsageName(
@@ -2208,9 +2210,9 @@
   /// \c min(N, availability_size) such structures.
   int clang_getCursorPlatformAvailability(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<pkg_ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<pkg_ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size,
@@ -2495,7 +2497,7 @@
   void clang_getOverriddenCursors(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden,
+    ffi.Pointer<pkg_ffi.UnsignedInt> num_overridden,
   ) {
     return _clang_getOverriddenCursors(
       cursor,
@@ -3637,7 +3639,7 @@
   /// CXTypeLayoutError_InvalidFieldName is returned.
   int clang_Type_getOffsetOf(
     CXType T,
-    ffi.Pointer<ffi.Int8> S,
+    ffi.Pointer<pkg_ffi.Char> S,
   ) {
     return _clang_Type_getOffsetOf(
       T,
@@ -3996,7 +3998,7 @@
 
   /// Construct a USR for a specified Objective-C class.
   CXString clang_constructUSR_ObjCClass(
-    ffi.Pointer<ffi.Int8> class_name,
+    ffi.Pointer<pkg_ffi.Char> class_name,
   ) {
     return _clang_constructUSR_ObjCClass(
       class_name,
@@ -4011,8 +4013,8 @@
 
   /// Construct a USR for a specified Objective-C category.
   CXString clang_constructUSR_ObjCCategory(
-    ffi.Pointer<ffi.Int8> class_name,
-    ffi.Pointer<ffi.Int8> category_name,
+    ffi.Pointer<pkg_ffi.Char> class_name,
+    ffi.Pointer<pkg_ffi.Char> category_name,
   ) {
     return _clang_constructUSR_ObjCCategory(
       class_name,
@@ -4029,7 +4031,7 @@
 
   /// Construct a USR for a specified Objective-C protocol.
   CXString clang_constructUSR_ObjCProtocol(
-    ffi.Pointer<ffi.Int8> protocol_name,
+    ffi.Pointer<pkg_ffi.Char> protocol_name,
   ) {
     return _clang_constructUSR_ObjCProtocol(
       protocol_name,
@@ -4046,7 +4048,7 @@
   /// Construct a USR for a specified Objective-C instance variable and
   /// the USR for its containing class.
   CXString clang_constructUSR_ObjCIvar(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCIvar(
@@ -4064,7 +4066,7 @@
   /// Construct a USR for a specified Objective-C method and
   /// the USR for its containing class.
   CXString clang_constructUSR_ObjCMethod(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     int isInstanceMethod,
     CXString classUSR,
   ) {
@@ -4084,7 +4086,7 @@
   /// Construct a USR for a specified Objective-C property and the USR
   /// for its containing class.
   CXString clang_constructUSR_ObjCProperty(
-    ffi.Pointer<ffi.Int8> property,
+    ffi.Pointer<pkg_ffi.Char> property,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCProperty(
@@ -4558,7 +4560,7 @@
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated,
+    ffi.Pointer<pkg_ffi.UnsignedInt> isGenerated,
   ) {
     return _clang_Cursor_isExternalSymbol(
       C,
@@ -5244,7 +5246,7 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens,
+    ffi.Pointer<pkg_ffi.UnsignedInt> NumTokens,
   ) {
     return _clang_tokenize(
       TU,
@@ -5348,12 +5350,12 @@
 
   void clang_getDefinitionSpellingAndExtent(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> endBuf,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startColumn,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endColumn,
   ) {
     return _clang_getDefinitionSpellingAndExtent(
       arg0,
@@ -5820,7 +5822,7 @@
   /// completion fails, returns NULL.
   ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<pkg_ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
@@ -5960,7 +5962,7 @@
   /// container
   int clang_codeCompleteGetContainerKind(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete,
+    ffi.Pointer<pkg_ffi.UnsignedInt> IsIncomplete,
   ) {
     return _clang_codeCompleteGetContainerKind(
       Results,
@@ -6193,7 +6195,7 @@
   /// kind is other than Int or float. User must not free this pointer,
   /// instead call clang_EvalResult_dispose on the CXEvalResult returned
   /// by clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<pkg_ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -6229,7 +6231,7 @@
   /// \returns the requested remapping. This remapping must be freed
   /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
   CXRemapping clang_getRemappings(
-    ffi.Pointer<ffi.Int8> path,
+    ffi.Pointer<pkg_ffi.Char> path,
   ) {
     return _clang_getRemappings(
       path,
@@ -6251,7 +6253,7 @@
   /// \returns the requested remapping. This remapping must be freed
   /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
   CXRemapping clang_getRemappingsFromFileList(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> filePaths,
     int numFiles,
   ) {
     return _clang_getRemappingsFromFileList(
@@ -6636,8 +6638,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -6675,8 +6677,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -6753,9 +6755,9 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_indexLoc_getFileLocation(
       loc,
@@ -7648,20 +7650,21 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
   external ffi.Pointer<CXString> Strings;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int Count;
 }
 
-typedef NativeClang_getCString = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_getCString = ffi.Pointer<pkg_ffi.Char> Function(
     CXString string);
-typedef DartClang_getCString = ffi.Pointer<ffi.Int8> Function(CXString string);
+typedef DartClang_getCString = ffi.Pointer<pkg_ffi.Char> Function(
+    CXString string);
 typedef NativeClang_disposeString = ffi.Void Function(CXString string);
 typedef DartClang_disposeString = void Function(CXString string);
 typedef NativeClang_disposeStringSet = ffi.Void Function(
@@ -7682,13 +7685,13 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<pkg_ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<pkg_ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @custom_import.UnsignedLong()
   external int Length;
 }
 
@@ -7696,19 +7699,19 @@
 class CXVersion extends ffi.Struct {
   /// The major version number, e.g., the '10' in '10.7.3'. A negative
   /// value indicates that there is no version number at all.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value
   /// will be negative if no minor version number was provided, e.g., for
   /// version '10'.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value
   /// will be negative if no minor or subminor version number was provided,
   /// e.g., in version '10' or '10.7'.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Subminor;
 }
 
@@ -7716,7 +7719,7 @@
 /// typically be linked together into an executable or library.
 typedef CXIndex = ffi.Pointer<ffi.Void>;
 typedef NativeClang_createIndex = CXIndex Function(
-    ffi.Int32 excludeDeclarationsFromPCH, ffi.Int32 displayDiagnostics);
+    pkg_ffi.Int excludeDeclarationsFromPCH, pkg_ffi.Int displayDiagnostics);
 typedef DartClang_createIndex = CXIndex Function(
     int excludeDeclarationsFromPCH, int displayDiagnostics);
 typedef NativeClang_disposeIndex = ffi.Void Function(CXIndex index);
@@ -7746,16 +7749,16 @@
 }
 
 typedef NativeClang_CXIndex_setGlobalOptions = ffi.Void Function(
-    CXIndex arg0, ffi.Uint32 options);
+    CXIndex arg0, pkg_ffi.UnsignedInt options);
 typedef DartClang_CXIndex_setGlobalOptions = void Function(
     CXIndex arg0, int options);
-typedef NativeClang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
+typedef NativeClang_CXIndex_getGlobalOptions = pkg_ffi.UnsignedInt Function(
     CXIndex arg0);
 typedef DartClang_CXIndex_getGlobalOptions = int Function(CXIndex arg0);
 typedef NativeClang_CXIndex_setInvocationEmissionPathOption = ffi.Void Function(
-    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
+    CXIndex arg0, ffi.Pointer<pkg_ffi.Char> Path);
 typedef DartClang_CXIndex_setInvocationEmissionPathOption = void Function(
-    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
+    CXIndex arg0, ffi.Pointer<pkg_ffi.Char> Path);
 
 /// A particular source file that is part of a translation unit.
 typedef CXFile = ffi.Pointer<ffi.Void>;
@@ -7768,29 +7771,29 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Array.multi([3])
-  external ffi.Array<ffi.Uint64> data;
+  external ffi.Array<pkg_ffi.UnsignedLongLong> data;
 }
 
-typedef NativeClang_getFileUniqueID = ffi.Int32 Function(
+typedef NativeClang_getFileUniqueID = pkg_ffi.Int Function(
     CXFile file, ffi.Pointer<CXFileUniqueID> outID);
 typedef DartClang_getFileUniqueID = int Function(
     CXFile file, ffi.Pointer<CXFileUniqueID> outID);
 
 /// A single translation unit, which resides in an index.
 typedef CXTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>;
-typedef NativeClang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
+typedef NativeClang_isFileMultipleIncludeGuarded = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit tu, CXFile file);
 typedef DartClang_isFileMultipleIncludeGuarded = int Function(
     CXTranslationUnit tu, CXFile file);
 typedef NativeClang_getFile = CXFile Function(
-    CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
+    CXTranslationUnit tu, ffi.Pointer<pkg_ffi.Char> file_name);
 typedef DartClang_getFile = CXFile Function(
-    CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
-typedef NativeClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
-typedef DartClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
-typedef NativeClang_File_isEqual = ffi.Int32 Function(
+    CXTranslationUnit tu, ffi.Pointer<pkg_ffi.Char> file_name);
+typedef NativeClang_getFileContents = ffi.Pointer<pkg_ffi.Char> Function(
+    CXTranslationUnit tu, CXFile file, ffi.Pointer<pkg_ffi.Size> size);
+typedef DartClang_getFileContents = ffi.Pointer<pkg_ffi.Char> Function(
+    CXTranslationUnit tu, CXFile file, ffi.Pointer<pkg_ffi.Size> size);
+typedef NativeClang_File_isEqual = pkg_ffi.Int Function(
     CXFile file1, CXFile file2);
 typedef DartClang_File_isEqual = int Function(CXFile file1, CXFile file2);
 typedef NativeClang_File_tryGetRealPathName = CXString Function(CXFile file);
@@ -7805,7 +7808,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -7817,32 +7820,35 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int end_int_data;
 }
 
 typedef NativeClang_getNullLocation = CXSourceLocation Function();
 typedef DartClang_getNullLocation = CXSourceLocation Function();
-typedef NativeClang_equalLocations = ffi.Uint32 Function(
+typedef NativeClang_equalLocations = pkg_ffi.UnsignedInt Function(
     CXSourceLocation loc1, CXSourceLocation loc2);
 typedef DartClang_equalLocations = int Function(
     CXSourceLocation loc1, CXSourceLocation loc2);
 typedef NativeClang_getLocation = CXSourceLocation Function(
-    CXTranslationUnit tu, CXFile file, ffi.Uint32 line, ffi.Uint32 column);
+    CXTranslationUnit tu,
+    CXFile file,
+    pkg_ffi.UnsignedInt line,
+    pkg_ffi.UnsignedInt column);
 typedef DartClang_getLocation = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, int line, int column);
 typedef NativeClang_getLocationForOffset = CXSourceLocation Function(
-    CXTranslationUnit tu, CXFile file, ffi.Uint32 offset);
+    CXTranslationUnit tu, CXFile file, pkg_ffi.UnsignedInt offset);
 typedef DartClang_getLocationForOffset = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, int offset);
-typedef NativeClang_Location_isInSystemHeader = ffi.Int32 Function(
+typedef NativeClang_Location_isInSystemHeader = pkg_ffi.Int Function(
     CXSourceLocation location);
 typedef DartClang_Location_isInSystemHeader = int Function(
     CXSourceLocation location);
-typedef NativeClang_Location_isFromMainFile = ffi.Int32 Function(
+typedef NativeClang_Location_isFromMainFile = pkg_ffi.Int Function(
     CXSourceLocation location);
 typedef DartClang_Location_isFromMainFile = int Function(
     CXSourceLocation location);
@@ -7852,70 +7858,70 @@
     CXSourceLocation begin, CXSourceLocation end);
 typedef DartClang_getRange = CXSourceRange Function(
     CXSourceLocation begin, CXSourceLocation end);
-typedef NativeClang_equalRanges = ffi.Uint32 Function(
+typedef NativeClang_equalRanges = pkg_ffi.UnsignedInt Function(
     CXSourceRange range1, CXSourceRange range2);
 typedef DartClang_equalRanges = int Function(
     CXSourceRange range1, CXSourceRange range2);
-typedef NativeClang_Range_isNull = ffi.Int32 Function(CXSourceRange range);
+typedef NativeClang_Range_isNull = pkg_ffi.Int Function(CXSourceRange range);
 typedef DartClang_Range_isNull = int Function(CXSourceRange range);
 typedef NativeClang_getExpansionLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef DartClang_getExpansionLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef NativeClang_getPresumedLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column);
 typedef DartClang_getPresumedLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column);
 typedef NativeClang_getInstantiationLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef DartClang_getInstantiationLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef NativeClang_getSpellingLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef DartClang_getSpellingLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef NativeClang_getFileLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef DartClang_getFileLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef NativeClang_getRangeStart = CXSourceLocation Function(
     CXSourceRange range);
 typedef DartClang_getRangeStart = CXSourceLocation Function(
@@ -7927,7 +7933,7 @@
 /// Identifies an array of ranges.
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the \c ranges array.
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int count;
 
   /// An array of \c CXSourceRanges.
@@ -7949,7 +7955,7 @@
 
 /// A group of CXDiagnostics.
 typedef CXDiagnosticSet = ffi.Pointer<ffi.Void>;
-typedef NativeClang_getNumDiagnosticsInSet = ffi.Uint32 Function(
+typedef NativeClang_getNumDiagnosticsInSet = pkg_ffi.UnsignedInt Function(
     CXDiagnosticSet Diags);
 typedef DartClang_getNumDiagnosticsInSet = int Function(CXDiagnosticSet Diags);
 
@@ -7957,7 +7963,7 @@
 /// location, text, source ranges, and fix-it hints.
 typedef CXDiagnostic = ffi.Pointer<ffi.Void>;
 typedef NativeClang_getDiagnosticInSet = CXDiagnostic Function(
-    CXDiagnosticSet Diags, ffi.Uint32 Index);
+    CXDiagnosticSet Diags, pkg_ffi.UnsignedInt Index);
 typedef DartClang_getDiagnosticInSet = CXDiagnostic Function(
     CXDiagnosticSet Diags, int Index);
 
@@ -7981,11 +7987,11 @@
 }
 
 typedef NativeClang_loadDiagnostics = CXDiagnosticSet Function(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<pkg_ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString);
 typedef DartClang_loadDiagnostics = CXDiagnosticSet Function(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<pkg_ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString);
 typedef NativeClang_disposeDiagnosticSet = ffi.Void Function(
@@ -7995,11 +8001,11 @@
     CXDiagnostic D);
 typedef DartClang_getChildDiagnostics = CXDiagnosticSet Function(
     CXDiagnostic D);
-typedef NativeClang_getNumDiagnostics = ffi.Uint32 Function(
+typedef NativeClang_getNumDiagnostics = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit Unit);
 typedef DartClang_getNumDiagnostics = int Function(CXTranslationUnit Unit);
 typedef NativeClang_getDiagnostic = CXDiagnostic Function(
-    CXTranslationUnit Unit, ffi.Uint32 Index);
+    CXTranslationUnit Unit, pkg_ffi.UnsignedInt Index);
 typedef DartClang_getDiagnostic = CXDiagnostic Function(
     CXTranslationUnit Unit, int Index);
 typedef NativeClang_getDiagnosticSetFromTU = CXDiagnosticSet Function(
@@ -8010,10 +8016,11 @@
     CXDiagnostic Diagnostic);
 typedef DartClang_disposeDiagnostic = void Function(CXDiagnostic Diagnostic);
 typedef NativeClang_formatDiagnostic = CXString Function(
-    CXDiagnostic Diagnostic, ffi.Uint32 Options);
+    CXDiagnostic Diagnostic, pkg_ffi.UnsignedInt Options);
 typedef DartClang_formatDiagnostic = CXString Function(
     CXDiagnostic Diagnostic, int Options);
-typedef NativeClang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
+typedef NativeClang_defaultDiagnosticDisplayOptions = pkg_ffi.UnsignedInt
+    Function();
 typedef DartClang_defaultDiagnosticDisplayOptions = int Function();
 
 /// Describes the severity of a particular diagnostic.
@@ -8053,30 +8060,30 @@
     CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
 typedef DartClang_getDiagnosticOption = CXString Function(
     CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
-typedef NativeClang_getDiagnosticCategory = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticCategory = pkg_ffi.UnsignedInt Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticCategory = int Function(CXDiagnostic arg0);
 typedef NativeClang_getDiagnosticCategoryName = CXString Function(
-    ffi.Uint32 Category);
+    pkg_ffi.UnsignedInt Category);
 typedef DartClang_getDiagnosticCategoryName = CXString Function(int Category);
 typedef NativeClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
-typedef NativeClang_getDiagnosticNumRanges = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticNumRanges = pkg_ffi.UnsignedInt Function(
     CXDiagnostic arg0);
 typedef DartClang_getDiagnosticNumRanges = int Function(CXDiagnostic arg0);
 typedef NativeClang_getDiagnosticRange = CXSourceRange Function(
-    CXDiagnostic Diagnostic, ffi.Uint32 Range);
+    CXDiagnostic Diagnostic, pkg_ffi.UnsignedInt Range);
 typedef DartClang_getDiagnosticRange = CXSourceRange Function(
     CXDiagnostic Diagnostic, int Range);
-typedef NativeClang_getDiagnosticNumFixIts = ffi.Uint32 Function(
+typedef NativeClang_getDiagnosticNumFixIts = pkg_ffi.UnsignedInt Function(
     CXDiagnostic Diagnostic);
 typedef DartClang_getDiagnosticNumFixIts = int Function(
     CXDiagnostic Diagnostic);
 typedef NativeClang_getDiagnosticFixIt = CXString Function(
     CXDiagnostic Diagnostic,
-    ffi.Uint32 FixIt,
+    pkg_ffi.UnsignedInt FixIt,
     ffi.Pointer<CXSourceRange> ReplacementRange);
 typedef DartClang_getDiagnosticFixIt = CXString Function(
     CXDiagnostic Diagnostic,
@@ -8089,23 +8096,23 @@
 typedef NativeClang_createTranslationUnitFromSourceFile
     = CXTranslationUnit Function(
         CXIndex CIdx,
-        ffi.Pointer<ffi.Int8> source_filename,
-        ffi.Int32 num_clang_command_line_args,
-        ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
-        ffi.Uint32 num_unsaved_files,
+        ffi.Pointer<pkg_ffi.Char> source_filename,
+        pkg_ffi.Int num_clang_command_line_args,
+        ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> clang_command_line_args,
+        pkg_ffi.UnsignedInt num_unsaved_files,
         ffi.Pointer<CXUnsavedFile> unsaved_files);
 typedef DartClang_createTranslationUnitFromSourceFile
     = CXTranslationUnit Function(
         CXIndex CIdx,
-        ffi.Pointer<ffi.Int8> source_filename,
+        ffi.Pointer<pkg_ffi.Char> source_filename,
         int num_clang_command_line_args,
-        ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+        ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> clang_command_line_args,
         int num_unsaved_files,
         ffi.Pointer<CXUnsavedFile> unsaved_files);
 typedef NativeClang_createTranslationUnit = CXTranslationUnit Function(
-    CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
+    CXIndex CIdx, ffi.Pointer<pkg_ffi.Char> ast_filename);
 typedef DartClang_createTranslationUnit = CXTranslationUnit Function(
-    CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
+    CXIndex CIdx, ffi.Pointer<pkg_ffi.Char> ast_filename);
 
 /// Error codes returned by libclang routines.
 ///
@@ -8132,42 +8139,46 @@
   static const int CXError_ASTReadError = 4;
 }
 
-typedef NativeClang_createTranslationUnit2 = ffi.Int32 Function(CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
-typedef DartClang_createTranslationUnit2 = int Function(CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
-typedef NativeClang_defaultEditingTranslationUnitOptions = ffi.Uint32
+typedef NativeClang_createTranslationUnit2 = ffi.Int32 Function(
+    CXIndex CIdx,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
+    ffi.Pointer<CXTranslationUnit> out_TU);
+typedef DartClang_createTranslationUnit2 = int Function(
+    CXIndex CIdx,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
+    ffi.Pointer<CXTranslationUnit> out_TU);
+typedef NativeClang_defaultEditingTranslationUnitOptions = pkg_ffi.UnsignedInt
     Function();
 typedef DartClang_defaultEditingTranslationUnitOptions = int Function();
 typedef NativeClang_parseTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
+    pkg_ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options);
+    pkg_ffi.UnsignedInt num_unsaved_files,
+    pkg_ffi.UnsignedInt options);
 typedef DartClang_parseTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options);
 typedef NativeClang_parseTranslationUnit2 = ffi.Int32 Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
+    pkg_ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options,
+    pkg_ffi.UnsignedInt num_unsaved_files,
+    pkg_ffi.UnsignedInt options,
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef DartClang_parseTranslationUnit2 = int Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -8175,44 +8186,46 @@
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef NativeClang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
+    pkg_ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Uint32 options,
+    pkg_ffi.UnsignedInt num_unsaved_files,
+    pkg_ffi.UnsignedInt options,
     ffi.Pointer<CXTranslationUnit> out_TU);
 typedef DartClang_parseTranslationUnit2FullArgv = int Function(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options,
     ffi.Pointer<CXTranslationUnit> out_TU);
-typedef NativeClang_defaultSaveOptions = ffi.Uint32 Function(
+typedef NativeClang_defaultSaveOptions = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit TU);
 typedef DartClang_defaultSaveOptions = int Function(CXTranslationUnit TU);
-typedef NativeClang_saveTranslationUnit = ffi.Int32 Function(
-    CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, ffi.Uint32 options);
+typedef NativeClang_saveTranslationUnit = pkg_ffi.Int Function(
+    CXTranslationUnit TU,
+    ffi.Pointer<pkg_ffi.Char> FileName,
+    pkg_ffi.UnsignedInt options);
 typedef DartClang_saveTranslationUnit = int Function(
-    CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, int options);
-typedef NativeClang_suspendTranslationUnit = ffi.Uint32 Function(
+    CXTranslationUnit TU, ffi.Pointer<pkg_ffi.Char> FileName, int options);
+typedef NativeClang_suspendTranslationUnit = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit arg0);
 typedef DartClang_suspendTranslationUnit = int Function(CXTranslationUnit arg0);
 typedef NativeClang_disposeTranslationUnit = ffi.Void Function(
     CXTranslationUnit arg0);
 typedef DartClang_disposeTranslationUnit = void Function(
     CXTranslationUnit arg0);
-typedef NativeClang_defaultReparseOptions = ffi.Uint32 Function(
+typedef NativeClang_defaultReparseOptions = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit TU);
 typedef DartClang_defaultReparseOptions = int Function(CXTranslationUnit TU);
-typedef NativeClang_reparseTranslationUnit = ffi.Int32 Function(
+typedef NativeClang_reparseTranslationUnit = pkg_ffi.Int Function(
     CXTranslationUnit TU,
-    ffi.Uint32 num_unsaved_files,
+    pkg_ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 options);
+    pkg_ffi.UnsignedInt options);
 typedef DartClang_reparseTranslationUnit = int Function(
     CXTranslationUnit TU,
     int num_unsaved_files,
@@ -8241,16 +8254,16 @@
   static const int CXTUResourceUsage_Last = 14;
 }
 
-typedef NativeClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_getTUResourceUsageName = ffi.Pointer<pkg_ffi.Char> Function(
     ffi.Int32 kind);
-typedef DartClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_getTUResourceUsageName = ffi.Pointer<pkg_ffi.Char> Function(
     int kind);
 
 class CXTUResourceUsageEntry extends ffi.Struct {
   @ffi.Int32()
   external int kind;
 
-  @ffi.Uint64()
+  @custom_import.UnsignedLong()
   external int amount;
 }
 
@@ -8258,7 +8271,7 @@
 class CXTUResourceUsage extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numEntries;
 
   external ffi.Pointer<CXTUResourceUsageEntry> entries;
@@ -8284,7 +8297,7 @@
 typedef DartClang_TargetInfo_dispose = void Function(CXTargetInfo Info);
 typedef NativeClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
 typedef DartClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
-typedef NativeClang_TargetInfo_getPointerWidth = ffi.Int32 Function(
+typedef NativeClang_TargetInfo_getPointerWidth = pkg_ffi.Int Function(
     CXTargetInfo Info);
 typedef DartClang_TargetInfo_getPointerWidth = int Function(CXTargetInfo Info);
 
@@ -8308,7 +8321,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
@@ -9107,36 +9120,40 @@
     CXTranslationUnit arg0);
 typedef DartClang_getTranslationUnitCursor = CXCursor Function(
     CXTranslationUnit arg0);
-typedef NativeClang_equalCursors = ffi.Uint32 Function(
+typedef NativeClang_equalCursors = pkg_ffi.UnsignedInt Function(
     CXCursor arg0, CXCursor arg1);
 typedef DartClang_equalCursors = int Function(CXCursor arg0, CXCursor arg1);
-typedef NativeClang_Cursor_isNull = ffi.Int32 Function(CXCursor cursor);
+typedef NativeClang_Cursor_isNull = pkg_ffi.Int Function(CXCursor cursor);
 typedef DartClang_Cursor_isNull = int Function(CXCursor cursor);
-typedef NativeClang_hashCursor = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_hashCursor = pkg_ffi.UnsignedInt Function(CXCursor arg0);
 typedef DartClang_hashCursor = int Function(CXCursor arg0);
 typedef NativeClang_getCursorKind = ffi.Int32 Function(CXCursor arg0);
 typedef DartClang_getCursorKind = int Function(CXCursor arg0);
-typedef NativeClang_isDeclaration = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isDeclaration = pkg_ffi.UnsignedInt Function(
+    ffi.Int32 arg0);
 typedef DartClang_isDeclaration = int Function(int arg0);
-typedef NativeClang_isInvalidDeclaration = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isInvalidDeclaration = pkg_ffi.UnsignedInt Function(
+    CXCursor arg0);
 typedef DartClang_isInvalidDeclaration = int Function(CXCursor arg0);
-typedef NativeClang_isReference = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isReference = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isReference = int Function(int arg0);
-typedef NativeClang_isExpression = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isExpression = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isExpression = int Function(int arg0);
-typedef NativeClang_isStatement = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isStatement = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isStatement = int Function(int arg0);
-typedef NativeClang_isAttribute = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isAttribute = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isAttribute = int Function(int arg0);
-typedef NativeClang_Cursor_hasAttrs = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_hasAttrs = pkg_ffi.UnsignedInt Function(CXCursor C);
 typedef DartClang_Cursor_hasAttrs = int Function(CXCursor C);
-typedef NativeClang_isInvalid = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isInvalid = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isInvalid = int Function(int arg0);
-typedef NativeClang_isTranslationUnit = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isTranslationUnit = pkg_ffi.UnsignedInt Function(
+    ffi.Int32 arg0);
 typedef DartClang_isTranslationUnit = int Function(int arg0);
-typedef NativeClang_isPreprocessing = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isPreprocessing = pkg_ffi.UnsignedInt Function(
+    ffi.Int32 arg0);
 typedef DartClang_isPreprocessing = int Function(int arg0);
-typedef NativeClang_isUnexposed = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef NativeClang_isUnexposed = pkg_ffi.UnsignedInt Function(ffi.Int32 arg0);
 typedef DartClang_isUnexposed = int Function(int arg0);
 
 /// Describe the linkage of the entity referred to by a cursor.
@@ -9224,7 +9241,7 @@
   external CXVersion Obsoleted;
 
   /// Whether the entity is unconditionally unavailable on this platform.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Unavailable;
 
   /// An optional message to provide to a user of this API, e.g., to
@@ -9232,19 +9249,19 @@
   external CXString Message;
 }
 
-typedef NativeClang_getCursorPlatformAvailability = ffi.Int32 Function(
+typedef NativeClang_getCursorPlatformAvailability = pkg_ffi.Int Function(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<pkg_ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<pkg_ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
-    ffi.Int32 availability_size);
+    pkg_ffi.Int availability_size);
 typedef DartClang_getCursorPlatformAvailability = int Function(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<pkg_ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<pkg_ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size);
@@ -9282,16 +9299,16 @@
 class CXCursorSetImpl extends ffi.Opaque {}
 
 /// A fast container representing a set of CXCursors.
-typedef CXCursorSet = ffi.Pointer<CXCursorSetImpl>;
+typedef CXCursorSet = ffi.Pointer<custom_import.CXCursorSetImpl>;
 typedef NativeClang_createCXCursorSet = CXCursorSet Function();
 typedef DartClang_createCXCursorSet = CXCursorSet Function();
 typedef NativeClang_disposeCXCursorSet = ffi.Void Function(CXCursorSet cset);
 typedef DartClang_disposeCXCursorSet = void Function(CXCursorSet cset);
-typedef NativeClang_CXCursorSet_contains = ffi.Uint32 Function(
+typedef NativeClang_CXCursorSet_contains = pkg_ffi.UnsignedInt Function(
     CXCursorSet cset, CXCursor cursor);
 typedef DartClang_CXCursorSet_contains = int Function(
     CXCursorSet cset, CXCursor cursor);
-typedef NativeClang_CXCursorSet_insert = ffi.Uint32 Function(
+typedef NativeClang_CXCursorSet_insert = pkg_ffi.UnsignedInt Function(
     CXCursorSet cset, CXCursor cursor);
 typedef DartClang_CXCursorSet_insert = int Function(
     CXCursorSet cset, CXCursor cursor);
@@ -9303,11 +9320,11 @@
 typedef NativeClang_getOverriddenCursors = ffi.Void Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden);
+    ffi.Pointer<pkg_ffi.UnsignedInt> num_overridden);
 typedef DartClang_getOverriddenCursors = void Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden);
+    ffi.Pointer<pkg_ffi.UnsignedInt> num_overridden);
 typedef NativeClang_disposeOverriddenCursors = ffi.Void Function(
     ffi.Pointer<CXCursor> overridden);
 typedef DartClang_disposeOverriddenCursors = void Function(
@@ -9471,19 +9488,20 @@
 typedef DartClang_getTypedefDeclUnderlyingType = CXType Function(CXCursor C);
 typedef NativeClang_getEnumDeclIntegerType = CXType Function(CXCursor C);
 typedef DartClang_getEnumDeclIntegerType = CXType Function(CXCursor C);
-typedef NativeClang_getEnumConstantDeclValue = ffi.Int64 Function(CXCursor C);
-typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C);
-typedef NativeClang_getEnumConstantDeclUnsignedValue = ffi.Uint64 Function(
+typedef NativeClang_getEnumConstantDeclValue = pkg_ffi.LongLong Function(
     CXCursor C);
+typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C);
+typedef NativeClang_getEnumConstantDeclUnsignedValue = pkg_ffi.UnsignedLongLong
+    Function(CXCursor C);
 typedef DartClang_getEnumConstantDeclUnsignedValue = int Function(CXCursor C);
-typedef NativeClang_getFieldDeclBitWidth = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_getFieldDeclBitWidth = pkg_ffi.Int Function(CXCursor C);
 typedef DartClang_getFieldDeclBitWidth = int Function(CXCursor C);
-typedef NativeClang_Cursor_getNumArguments = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_Cursor_getNumArguments = pkg_ffi.Int Function(CXCursor C);
 typedef DartClang_Cursor_getNumArguments = int Function(CXCursor C);
 typedef NativeClang_Cursor_getArgument = CXCursor Function(
-    CXCursor C, ffi.Uint32 i);
+    CXCursor C, pkg_ffi.UnsignedInt i);
 typedef DartClang_Cursor_getArgument = CXCursor Function(CXCursor C, int i);
-typedef NativeClang_Cursor_getNumTemplateArguments = ffi.Int32 Function(
+typedef NativeClang_Cursor_getNumTemplateArguments = pkg_ffi.Int Function(
     CXCursor C);
 typedef DartClang_Cursor_getNumTemplateArguments = int Function(CXCursor C);
 
@@ -9505,39 +9523,45 @@
 }
 
 typedef NativeClang_Cursor_getTemplateArgumentKind = ffi.Int32 Function(
-    CXCursor C, ffi.Uint32 I);
+    CXCursor C, pkg_ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentKind = int Function(
     CXCursor C, int I);
 typedef NativeClang_Cursor_getTemplateArgumentType = CXType Function(
-    CXCursor C, ffi.Uint32 I);
+    CXCursor C, pkg_ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentType = CXType Function(
     CXCursor C, int I);
-typedef NativeClang_Cursor_getTemplateArgumentValue = ffi.Int64 Function(
-    CXCursor C, ffi.Uint32 I);
+typedef NativeClang_Cursor_getTemplateArgumentValue = pkg_ffi.LongLong Function(
+    CXCursor C, pkg_ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentValue = int Function(
     CXCursor C, int I);
-typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue = ffi.Uint64
-    Function(CXCursor C, ffi.Uint32 I);
+typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue
+    = pkg_ffi.UnsignedLongLong Function(CXCursor C, pkg_ffi.UnsignedInt I);
 typedef DartClang_Cursor_getTemplateArgumentUnsignedValue = int Function(
     CXCursor C, int I);
-typedef NativeClang_equalTypes = ffi.Uint32 Function(CXType A, CXType B);
+typedef NativeClang_equalTypes = pkg_ffi.UnsignedInt Function(
+    CXType A, CXType B);
 typedef DartClang_equalTypes = int Function(CXType A, CXType B);
 typedef NativeClang_getCanonicalType = CXType Function(CXType T);
 typedef DartClang_getCanonicalType = CXType Function(CXType T);
-typedef NativeClang_isConstQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isConstQualifiedType = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isConstQualifiedType = int Function(CXType T);
-typedef NativeClang_Cursor_isMacroFunctionLike = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isMacroFunctionLike = pkg_ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_isMacroFunctionLike = int Function(CXCursor C);
-typedef NativeClang_Cursor_isMacroBuiltin = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isMacroBuiltin = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isMacroBuiltin = int Function(CXCursor C);
-typedef NativeClang_Cursor_isFunctionInlined = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isFunctionInlined = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isFunctionInlined = int Function(CXCursor C);
-typedef NativeClang_isVolatileQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isVolatileQualifiedType = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isVolatileQualifiedType = int Function(CXType T);
-typedef NativeClang_isRestrictQualifiedType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isRestrictQualifiedType = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isRestrictQualifiedType = int Function(CXType T);
-typedef NativeClang_getAddressSpace = ffi.Uint32 Function(CXType T);
+typedef NativeClang_getAddressSpace = pkg_ffi.UnsignedInt Function(CXType T);
 typedef DartClang_getAddressSpace = int Function(CXType T);
 typedef NativeClang_getTypedefName = CXString Function(CXType CT);
 typedef DartClang_getTypedefName = CXString Function(CXType CT);
@@ -9580,46 +9604,50 @@
 typedef DartClang_getFunctionTypeCallingConv = int Function(CXType T);
 typedef NativeClang_getResultType = CXType Function(CXType T);
 typedef DartClang_getResultType = CXType Function(CXType T);
-typedef NativeClang_getExceptionSpecificationType = ffi.Int32 Function(
+typedef NativeClang_getExceptionSpecificationType = pkg_ffi.Int Function(
     CXType T);
 typedef DartClang_getExceptionSpecificationType = int Function(CXType T);
-typedef NativeClang_getNumArgTypes = ffi.Int32 Function(CXType T);
+typedef NativeClang_getNumArgTypes = pkg_ffi.Int Function(CXType T);
 typedef DartClang_getNumArgTypes = int Function(CXType T);
-typedef NativeClang_getArgType = CXType Function(CXType T, ffi.Uint32 i);
+typedef NativeClang_getArgType = CXType Function(
+    CXType T, pkg_ffi.UnsignedInt i);
 typedef DartClang_getArgType = CXType Function(CXType T, int i);
 typedef NativeClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
 typedef DartClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
-typedef NativeClang_Type_getNumObjCProtocolRefs = ffi.Uint32 Function(CXType T);
+typedef NativeClang_Type_getNumObjCProtocolRefs = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_Type_getNumObjCProtocolRefs = int Function(CXType T);
 typedef NativeClang_Type_getObjCProtocolDecl = CXCursor Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, pkg_ffi.UnsignedInt i);
 typedef DartClang_Type_getObjCProtocolDecl = CXCursor Function(CXType T, int i);
-typedef NativeClang_Type_getNumObjCTypeArgs = ffi.Uint32 Function(CXType T);
+typedef NativeClang_Type_getNumObjCTypeArgs = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_Type_getNumObjCTypeArgs = int Function(CXType T);
 typedef NativeClang_Type_getObjCTypeArg = CXType Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, pkg_ffi.UnsignedInt i);
 typedef DartClang_Type_getObjCTypeArg = CXType Function(CXType T, int i);
-typedef NativeClang_isFunctionTypeVariadic = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isFunctionTypeVariadic = pkg_ffi.UnsignedInt Function(
+    CXType T);
 typedef DartClang_isFunctionTypeVariadic = int Function(CXType T);
 typedef NativeClang_getCursorResultType = CXType Function(CXCursor C);
 typedef DartClang_getCursorResultType = CXType Function(CXCursor C);
-typedef NativeClang_getCursorExceptionSpecificationType = ffi.Int32 Function(
+typedef NativeClang_getCursorExceptionSpecificationType = pkg_ffi.Int Function(
     CXCursor C);
 typedef DartClang_getCursorExceptionSpecificationType = int Function(
     CXCursor C);
-typedef NativeClang_isPODType = ffi.Uint32 Function(CXType T);
+typedef NativeClang_isPODType = pkg_ffi.UnsignedInt Function(CXType T);
 typedef DartClang_isPODType = int Function(CXType T);
 typedef NativeClang_getElementType = CXType Function(CXType T);
 typedef DartClang_getElementType = CXType Function(CXType T);
-typedef NativeClang_getNumElements = ffi.Int64 Function(CXType T);
+typedef NativeClang_getNumElements = pkg_ffi.LongLong Function(CXType T);
 typedef DartClang_getNumElements = int Function(CXType T);
 typedef NativeClang_getArrayElementType = CXType Function(CXType T);
 typedef DartClang_getArrayElementType = CXType Function(CXType T);
-typedef NativeClang_getArraySize = ffi.Int64 Function(CXType T);
+typedef NativeClang_getArraySize = pkg_ffi.LongLong Function(CXType T);
 typedef DartClang_getArraySize = int Function(CXType T);
 typedef NativeClang_Type_getNamedType = CXType Function(CXType T);
 typedef DartClang_Type_getNamedType = CXType Function(CXType T);
-typedef NativeClang_Type_isTransparentTagTypedef = ffi.Uint32 Function(
+typedef NativeClang_Type_isTransparentTagTypedef = pkg_ffi.UnsignedInt Function(
     CXType T);
 typedef DartClang_Type_isTransparentTagTypedef = int Function(CXType T);
 
@@ -9642,31 +9670,35 @@
 
 typedef NativeClang_Type_getNullability = ffi.Int32 Function(CXType T);
 typedef DartClang_Type_getNullability = int Function(CXType T);
-typedef NativeClang_Type_getAlignOf = ffi.Int64 Function(CXType T);
+typedef NativeClang_Type_getAlignOf = pkg_ffi.LongLong Function(CXType T);
 typedef DartClang_Type_getAlignOf = int Function(CXType T);
 typedef NativeClang_Type_getClassType = CXType Function(CXType T);
 typedef DartClang_Type_getClassType = CXType Function(CXType T);
-typedef NativeClang_Type_getSizeOf = ffi.Int64 Function(CXType T);
+typedef NativeClang_Type_getSizeOf = pkg_ffi.LongLong Function(CXType T);
 typedef DartClang_Type_getSizeOf = int Function(CXType T);
-typedef NativeClang_Type_getOffsetOf = ffi.Int64 Function(
-    CXType T, ffi.Pointer<ffi.Int8> S);
+typedef NativeClang_Type_getOffsetOf = pkg_ffi.LongLong Function(
+    CXType T, ffi.Pointer<pkg_ffi.Char> S);
 typedef DartClang_Type_getOffsetOf = int Function(
-    CXType T, ffi.Pointer<ffi.Int8> S);
+    CXType T, ffi.Pointer<pkg_ffi.Char> S);
 typedef NativeClang_Type_getModifiedType = CXType Function(CXType T);
 typedef DartClang_Type_getModifiedType = CXType Function(CXType T);
-typedef NativeClang_Cursor_getOffsetOfField = ffi.Int64 Function(CXCursor C);
+typedef NativeClang_Cursor_getOffsetOfField = pkg_ffi.LongLong Function(
+    CXCursor C);
 typedef DartClang_Cursor_getOffsetOfField = int Function(CXCursor C);
-typedef NativeClang_Cursor_isAnonymous = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isAnonymous = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isAnonymous = int Function(CXCursor C);
-typedef NativeClang_Cursor_isAnonymousRecordDecl = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isAnonymousRecordDecl = pkg_ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_isAnonymousRecordDecl = int Function(CXCursor C);
-typedef NativeClang_Cursor_isInlineNamespace = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isInlineNamespace = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isInlineNamespace = int Function(CXCursor C);
-typedef NativeClang_Type_getNumTemplateArguments = ffi.Int32 Function(CXType T);
+typedef NativeClang_Type_getNumTemplateArguments = pkg_ffi.Int Function(
+    CXType T);
 typedef DartClang_Type_getNumTemplateArguments = int Function(CXType T);
 typedef NativeClang_Type_getTemplateArgumentAsType = CXType Function(
-    CXType T, ffi.Uint32 i);
+    CXType T, pkg_ffi.UnsignedInt i);
 typedef DartClang_Type_getTemplateArgumentAsType = CXType Function(
     CXType T, int i);
 
@@ -9683,9 +9715,10 @@
 
 typedef NativeClang_Type_getCXXRefQualifier = ffi.Int32 Function(CXType T);
 typedef DartClang_Type_getCXXRefQualifier = int Function(CXType T);
-typedef NativeClang_Cursor_isBitField = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isBitField = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isBitField = int Function(CXCursor C);
-typedef NativeClang_isVirtualBase = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isVirtualBase = pkg_ffi.UnsignedInt Function(CXCursor arg0);
 typedef DartClang_isVirtualBase = int Function(CXCursor arg0);
 
 /// Represents the C++ access control level to a base class for a
@@ -9715,11 +9748,11 @@
 
 typedef NativeClang_Cursor_getStorageClass = ffi.Int32 Function(CXCursor arg0);
 typedef DartClang_Cursor_getStorageClass = int Function(CXCursor arg0);
-typedef NativeClang_getNumOverloadedDecls = ffi.Uint32 Function(
+typedef NativeClang_getNumOverloadedDecls = pkg_ffi.UnsignedInt Function(
     CXCursor cursor);
 typedef DartClang_getNumOverloadedDecls = int Function(CXCursor cursor);
 typedef NativeClang_getOverloadedDecl = CXCursor Function(
-    CXCursor cursor, ffi.Uint32 index);
+    CXCursor cursor, pkg_ffi.UnsignedInt index);
 typedef DartClang_getOverloadedDecl = CXCursor Function(
     CXCursor cursor, int index);
 typedef NativeClang_getIBOutletCollectionType = CXType Function(CXCursor arg0);
@@ -9759,40 +9792,44 @@
 /// Opaque pointer representing client data that will be passed through
 /// to various callbacks and visitors.
 typedef CXClientData = ffi.Pointer<ffi.Void>;
-typedef NativeClang_visitChildren = ffi.Uint32 Function(
+typedef NativeClang_visitChildren = pkg_ffi.UnsignedInt Function(
     CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
 typedef DartClang_visitChildren = int Function(
     CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
 typedef NativeClang_getCursorUSR = CXString Function(CXCursor arg0);
 typedef DartClang_getCursorUSR = CXString Function(CXCursor arg0);
 typedef NativeClang_constructUSR_ObjCClass = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name);
+    ffi.Pointer<pkg_ffi.Char> class_name);
 typedef DartClang_constructUSR_ObjCClass = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name);
+    ffi.Pointer<pkg_ffi.Char> class_name);
 typedef NativeClang_constructUSR_ObjCCategory = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
+    ffi.Pointer<pkg_ffi.Char> class_name,
+    ffi.Pointer<pkg_ffi.Char> category_name);
 typedef DartClang_constructUSR_ObjCCategory = CXString Function(
-    ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
+    ffi.Pointer<pkg_ffi.Char> class_name,
+    ffi.Pointer<pkg_ffi.Char> category_name);
 typedef NativeClang_constructUSR_ObjCProtocol = CXString Function(
-    ffi.Pointer<ffi.Int8> protocol_name);
+    ffi.Pointer<pkg_ffi.Char> protocol_name);
 typedef DartClang_constructUSR_ObjCProtocol = CXString Function(
-    ffi.Pointer<ffi.Int8> protocol_name);
+    ffi.Pointer<pkg_ffi.Char> protocol_name);
 typedef NativeClang_constructUSR_ObjCIvar = CXString Function(
-    ffi.Pointer<ffi.Int8> name, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> name, CXString classUSR);
 typedef DartClang_constructUSR_ObjCIvar = CXString Function(
-    ffi.Pointer<ffi.Int8> name, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> name, CXString classUSR);
 typedef NativeClang_constructUSR_ObjCMethod = CXString Function(
-    ffi.Pointer<ffi.Int8> name, ffi.Uint32 isInstanceMethod, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> name,
+    pkg_ffi.UnsignedInt isInstanceMethod,
+    CXString classUSR);
 typedef DartClang_constructUSR_ObjCMethod = CXString Function(
-    ffi.Pointer<ffi.Int8> name, int isInstanceMethod, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> name, int isInstanceMethod, CXString classUSR);
 typedef NativeClang_constructUSR_ObjCProperty = CXString Function(
-    ffi.Pointer<ffi.Int8> property, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> property, CXString classUSR);
 typedef DartClang_constructUSR_ObjCProperty = CXString Function(
-    ffi.Pointer<ffi.Int8> property, CXString classUSR);
+    ffi.Pointer<pkg_ffi.Char> property, CXString classUSR);
 typedef NativeClang_getCursorSpelling = CXString Function(CXCursor arg0);
 typedef DartClang_getCursorSpelling = CXString Function(CXCursor arg0);
 typedef NativeClang_Cursor_getSpellingNameRange = CXSourceRange Function(
-    CXCursor arg0, ffi.Uint32 pieceIndex, ffi.Uint32 options);
+    CXCursor arg0, pkg_ffi.UnsignedInt pieceIndex, pkg_ffi.UnsignedInt options);
 typedef DartClang_Cursor_getSpellingNameRange = CXSourceRange Function(
     CXCursor arg0, int pieceIndex, int options);
 
@@ -9833,12 +9870,12 @@
   static const int CXPrintingPolicy_LastProperty = 25;
 }
 
-typedef NativeClang_PrintingPolicy_getProperty = ffi.Uint32 Function(
+typedef NativeClang_PrintingPolicy_getProperty = pkg_ffi.UnsignedInt Function(
     CXPrintingPolicy Policy, ffi.Int32 Property);
 typedef DartClang_PrintingPolicy_getProperty = int Function(
     CXPrintingPolicy Policy, int Property);
 typedef NativeClang_PrintingPolicy_setProperty = ffi.Void Function(
-    CXPrintingPolicy Policy, ffi.Int32 Property, ffi.Uint32 Value);
+    CXPrintingPolicy Policy, ffi.Int32 Property, pkg_ffi.UnsignedInt Value);
 typedef DartClang_PrintingPolicy_setProperty = void Function(
     CXPrintingPolicy Policy, int Property, int Value);
 typedef NativeClang_getCursorPrintingPolicy = CXPrintingPolicy Function(
@@ -9859,19 +9896,20 @@
 typedef DartClang_getCursorReferenced = CXCursor Function(CXCursor arg0);
 typedef NativeClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
 typedef DartClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
-typedef NativeClang_isCursorDefinition = ffi.Uint32 Function(CXCursor arg0);
+typedef NativeClang_isCursorDefinition = pkg_ffi.UnsignedInt Function(
+    CXCursor arg0);
 typedef DartClang_isCursorDefinition = int Function(CXCursor arg0);
 typedef NativeClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
 typedef DartClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
-typedef NativeClang_Cursor_getObjCSelectorIndex = ffi.Int32 Function(
+typedef NativeClang_Cursor_getObjCSelectorIndex = pkg_ffi.Int Function(
     CXCursor arg0);
 typedef DartClang_Cursor_getObjCSelectorIndex = int Function(CXCursor arg0);
-typedef NativeClang_Cursor_isDynamicCall = ffi.Int32 Function(CXCursor C);
+typedef NativeClang_Cursor_isDynamicCall = pkg_ffi.Int Function(CXCursor C);
 typedef DartClang_Cursor_isDynamicCall = int Function(CXCursor C);
 typedef NativeClang_Cursor_getReceiverType = CXType Function(CXCursor C);
 typedef DartClang_Cursor_getReceiverType = CXType Function(CXCursor C);
-typedef NativeClang_Cursor_getObjCPropertyAttributes = ffi.Uint32 Function(
-    CXCursor C, ffi.Uint32 reserved);
+typedef NativeClang_Cursor_getObjCPropertyAttributes = pkg_ffi.UnsignedInt
+    Function(CXCursor C, pkg_ffi.UnsignedInt reserved);
 typedef DartClang_Cursor_getObjCPropertyAttributes = int Function(
     CXCursor C, int reserved);
 typedef NativeClang_Cursor_getObjCPropertyGetterName = CXString Function(
@@ -9882,23 +9920,25 @@
     CXCursor C);
 typedef DartClang_Cursor_getObjCPropertySetterName = CXString Function(
     CXCursor C);
-typedef NativeClang_Cursor_getObjCDeclQualifiers = ffi.Uint32 Function(
+typedef NativeClang_Cursor_getObjCDeclQualifiers = pkg_ffi.UnsignedInt Function(
     CXCursor C);
 typedef DartClang_Cursor_getObjCDeclQualifiers = int Function(CXCursor C);
-typedef NativeClang_Cursor_isObjCOptional = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isObjCOptional = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isObjCOptional = int Function(CXCursor C);
-typedef NativeClang_Cursor_isVariadic = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_Cursor_isVariadic = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_Cursor_isVariadic = int Function(CXCursor C);
-typedef NativeClang_Cursor_isExternalSymbol = ffi.Uint32 Function(
+typedef NativeClang_Cursor_isExternalSymbol = pkg_ffi.UnsignedInt Function(
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated);
+    ffi.Pointer<pkg_ffi.UnsignedInt> isGenerated);
 typedef DartClang_Cursor_isExternalSymbol = int Function(
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated);
+    ffi.Pointer<pkg_ffi.UnsignedInt> isGenerated);
 typedef NativeClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
 typedef DartClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
 typedef NativeClang_Cursor_getRawCommentText = CXString Function(CXCursor C);
@@ -9936,45 +9976,53 @@
 typedef DartClang_Module_getName = CXString Function(CXModule Module);
 typedef NativeClang_Module_getFullName = CXString Function(CXModule Module);
 typedef DartClang_Module_getFullName = CXString Function(CXModule Module);
-typedef NativeClang_Module_isSystem = ffi.Int32 Function(CXModule Module);
+typedef NativeClang_Module_isSystem = pkg_ffi.Int Function(CXModule Module);
 typedef DartClang_Module_isSystem = int Function(CXModule Module);
-typedef NativeClang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
+typedef NativeClang_Module_getNumTopLevelHeaders = pkg_ffi.UnsignedInt Function(
     CXTranslationUnit arg0, CXModule Module);
 typedef DartClang_Module_getNumTopLevelHeaders = int Function(
     CXTranslationUnit arg0, CXModule Module);
 typedef NativeClang_Module_getTopLevelHeader = CXFile Function(
-    CXTranslationUnit arg0, CXModule Module, ffi.Uint32 Index);
+    CXTranslationUnit arg0, CXModule Module, pkg_ffi.UnsignedInt Index);
 typedef DartClang_Module_getTopLevelHeader = CXFile Function(
     CXTranslationUnit arg0, CXModule Module, int Index);
-typedef NativeClang_CXXConstructor_isConvertingConstructor = ffi.Uint32
+typedef NativeClang_CXXConstructor_isConvertingConstructor = pkg_ffi.UnsignedInt
     Function(CXCursor C);
 typedef DartClang_CXXConstructor_isConvertingConstructor = int Function(
     CXCursor C);
-typedef NativeClang_CXXConstructor_isCopyConstructor = ffi.Uint32 Function(
-    CXCursor C);
+typedef NativeClang_CXXConstructor_isCopyConstructor = pkg_ffi.UnsignedInt
+    Function(CXCursor C);
 typedef DartClang_CXXConstructor_isCopyConstructor = int Function(CXCursor C);
-typedef NativeClang_CXXConstructor_isDefaultConstructor = ffi.Uint32 Function(
-    CXCursor C);
+typedef NativeClang_CXXConstructor_isDefaultConstructor = pkg_ffi.UnsignedInt
+    Function(CXCursor C);
 typedef DartClang_CXXConstructor_isDefaultConstructor = int Function(
     CXCursor C);
-typedef NativeClang_CXXConstructor_isMoveConstructor = ffi.Uint32 Function(
-    CXCursor C);
+typedef NativeClang_CXXConstructor_isMoveConstructor = pkg_ffi.UnsignedInt
+    Function(CXCursor C);
 typedef DartClang_CXXConstructor_isMoveConstructor = int Function(CXCursor C);
-typedef NativeClang_CXXField_isMutable = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXField_isMutable = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXField_isMutable = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isDefaulted = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isDefaulted = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isDefaulted = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isPureVirtual = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isPureVirtual = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isPureVirtual = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isStatic = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isStatic = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isStatic = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isVirtual = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isVirtual = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isVirtual = int Function(CXCursor C);
-typedef NativeClang_CXXRecord_isAbstract = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXRecord_isAbstract = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXRecord_isAbstract = int Function(CXCursor C);
-typedef NativeClang_EnumDecl_isScoped = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_EnumDecl_isScoped = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_EnumDecl_isScoped = int Function(CXCursor C);
-typedef NativeClang_CXXMethod_isConst = ffi.Uint32 Function(CXCursor C);
+typedef NativeClang_CXXMethod_isConst = pkg_ffi.UnsignedInt Function(
+    CXCursor C);
 typedef DartClang_CXXMethod_isConst = int Function(CXCursor C);
 typedef NativeClang_getTemplateCursorKind = ffi.Int32 Function(CXCursor C);
 typedef DartClang_getTemplateCursorKind = int Function(CXCursor C);
@@ -9982,14 +10030,14 @@
     CXCursor C);
 typedef DartClang_getSpecializedCursorTemplate = CXCursor Function(CXCursor C);
 typedef NativeClang_getCursorReferenceNameRange = CXSourceRange Function(
-    CXCursor C, ffi.Uint32 NameFlags, ffi.Uint32 PieceIndex);
+    CXCursor C, pkg_ffi.UnsignedInt NameFlags, pkg_ffi.UnsignedInt PieceIndex);
 typedef DartClang_getCursorReferenceNameRange = CXSourceRange Function(
     CXCursor C, int NameFlags, int PieceIndex);
 
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Array.multi([4])
-  external ffi.Array<ffi.Uint32> int_data;
+  external ffi.Array<pkg_ffi.UnsignedInt> int_data;
 
   external ffi.Pointer<ffi.Void> ptr_data;
 }
@@ -10035,48 +10083,48 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens);
+    ffi.Pointer<pkg_ffi.UnsignedInt> NumTokens);
 typedef DartClang_tokenize = void Function(
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens);
+    ffi.Pointer<pkg_ffi.UnsignedInt> NumTokens);
 typedef NativeClang_annotateTokens = ffi.Void Function(
     CXTranslationUnit TU,
     ffi.Pointer<CXToken> Tokens,
-    ffi.Uint32 NumTokens,
+    pkg_ffi.UnsignedInt NumTokens,
     ffi.Pointer<CXCursor> Cursors);
 typedef DartClang_annotateTokens = void Function(CXTranslationUnit TU,
     ffi.Pointer<CXToken> Tokens, int NumTokens, ffi.Pointer<CXCursor> Cursors);
-typedef NativeClang_disposeTokens = ffi.Void Function(
-    CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, ffi.Uint32 NumTokens);
+typedef NativeClang_disposeTokens = ffi.Void Function(CXTranslationUnit TU,
+    ffi.Pointer<CXToken> Tokens, pkg_ffi.UnsignedInt NumTokens);
 typedef DartClang_disposeTokens = void Function(
     CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, int NumTokens);
 typedef NativeClang_getCursorKindSpelling = CXString Function(ffi.Int32 Kind);
 typedef DartClang_getCursorKindSpelling = CXString Function(int Kind);
 typedef NativeClang_getDefinitionSpellingAndExtent = ffi.Void Function(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn);
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> endBuf,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startColumn,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endColumn);
 typedef DartClang_getDefinitionSpellingAndExtent = void Function(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn);
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> endBuf,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startColumn,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endColumn);
 typedef NativeClang_enableStackTraces = ffi.Void Function();
 typedef DartClang_enableStackTraces = void Function();
 typedef NativeClang_executeOnThread = ffi.Void Function(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         fn,
     ffi.Pointer<ffi.Void> user_data,
-    ffi.Uint32 stack_size);
+    pkg_ffi.UnsignedInt stack_size);
 typedef DartClang_executeOnThread = void Function(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         fn,
@@ -10262,22 +10310,23 @@
 }
 
 typedef NativeClang_getCompletionChunkKind = ffi.Int32 Function(
-    CXCompletionString completion_string, ffi.Uint32 chunk_number);
+    CXCompletionString completion_string, pkg_ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkKind = int Function(
     CXCompletionString completion_string, int chunk_number);
 typedef NativeClang_getCompletionChunkText = CXString Function(
-    CXCompletionString completion_string, ffi.Uint32 chunk_number);
+    CXCompletionString completion_string, pkg_ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkText = CXString Function(
     CXCompletionString completion_string, int chunk_number);
-typedef NativeClang_getCompletionChunkCompletionString = CXCompletionString
-    Function(CXCompletionString completion_string, ffi.Uint32 chunk_number);
+typedef NativeClang_getCompletionChunkCompletionString
+    = CXCompletionString Function(
+        CXCompletionString completion_string, pkg_ffi.UnsignedInt chunk_number);
 typedef DartClang_getCompletionChunkCompletionString = CXCompletionString
     Function(CXCompletionString completion_string, int chunk_number);
-typedef NativeClang_getNumCompletionChunks = ffi.Uint32 Function(
+typedef NativeClang_getNumCompletionChunks = pkg_ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getNumCompletionChunks = int Function(
     CXCompletionString completion_string);
-typedef NativeClang_getCompletionPriority = ffi.Uint32 Function(
+typedef NativeClang_getCompletionPriority = pkg_ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getCompletionPriority = int Function(
     CXCompletionString completion_string);
@@ -10285,12 +10334,13 @@
     CXCompletionString completion_string);
 typedef DartClang_getCompletionAvailability = int Function(
     CXCompletionString completion_string);
-typedef NativeClang_getCompletionNumAnnotations = ffi.Uint32 Function(
+typedef NativeClang_getCompletionNumAnnotations = pkg_ffi.UnsignedInt Function(
     CXCompletionString completion_string);
 typedef DartClang_getCompletionNumAnnotations = int Function(
     CXCompletionString completion_string);
 typedef NativeClang_getCompletionAnnotation = CXString Function(
-    CXCompletionString completion_string, ffi.Uint32 annotation_number);
+    CXCompletionString completion_string,
+    pkg_ffi.UnsignedInt annotation_number);
 typedef DartClang_getCompletionAnnotation = CXString Function(
     CXCompletionString completion_string, int annotation_number);
 typedef NativeClang_getCompletionParent = CXString Function(
@@ -10317,69 +10367,70 @@
 
   /// The number of code-completion results stored in the
   /// \c Results array.
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int NumResults;
 }
 
-typedef NativeClang_getCompletionNumFixIts = ffi.Uint32 Function(
-    ffi.Pointer<CXCodeCompleteResults> results, ffi.Uint32 completion_index);
+typedef NativeClang_getCompletionNumFixIts = pkg_ffi.UnsignedInt Function(
+    ffi.Pointer<CXCodeCompleteResults> results,
+    pkg_ffi.UnsignedInt completion_index);
 typedef DartClang_getCompletionNumFixIts = int Function(
     ffi.Pointer<CXCodeCompleteResults> results, int completion_index);
 typedef NativeClang_getCompletionFixIt = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> results,
-    ffi.Uint32 completion_index,
-    ffi.Uint32 fixit_index,
+    pkg_ffi.UnsignedInt completion_index,
+    pkg_ffi.UnsignedInt fixit_index,
     ffi.Pointer<CXSourceRange> replacement_range);
 typedef DartClang_getCompletionFixIt = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> results,
     int completion_index,
     int fixit_index,
     ffi.Pointer<CXSourceRange> replacement_range);
-typedef NativeClang_defaultCodeCompleteOptions = ffi.Uint32 Function();
+typedef NativeClang_defaultCodeCompleteOptions = pkg_ffi.UnsignedInt Function();
 typedef DartClang_defaultCodeCompleteOptions = int Function();
 typedef NativeClang_codeCompleteAt
     = ffi.Pointer<CXCodeCompleteResults> Function(
         CXTranslationUnit TU,
-        ffi.Pointer<ffi.Int8> complete_filename,
-        ffi.Uint32 complete_line,
-        ffi.Uint32 complete_column,
+        ffi.Pointer<pkg_ffi.Char> complete_filename,
+        pkg_ffi.UnsignedInt complete_line,
+        pkg_ffi.UnsignedInt complete_column,
         ffi.Pointer<CXUnsavedFile> unsaved_files,
-        ffi.Uint32 num_unsaved_files,
-        ffi.Uint32 options);
+        pkg_ffi.UnsignedInt num_unsaved_files,
+        pkg_ffi.UnsignedInt options);
 typedef DartClang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults> Function(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<pkg_ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     int options);
 typedef NativeClang_sortCodeCompletionResults = ffi.Void Function(
-    ffi.Pointer<CXCompletionResult> Results, ffi.Uint32 NumResults);
+    ffi.Pointer<CXCompletionResult> Results, pkg_ffi.UnsignedInt NumResults);
 typedef DartClang_sortCodeCompletionResults = void Function(
     ffi.Pointer<CXCompletionResult> Results, int NumResults);
 typedef NativeClang_disposeCodeCompleteResults = ffi.Void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_disposeCodeCompleteResults = void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef NativeClang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
-    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef NativeClang_codeCompleteGetNumDiagnostics = pkg_ffi.UnsignedInt
+    Function(ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetNumDiagnostics = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef NativeClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
-    ffi.Pointer<CXCodeCompleteResults> Results, ffi.Uint32 Index);
+    ffi.Pointer<CXCodeCompleteResults> Results, pkg_ffi.UnsignedInt Index);
 typedef DartClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
     ffi.Pointer<CXCodeCompleteResults> Results, int Index);
-typedef NativeClang_codeCompleteGetContexts = ffi.Uint64 Function(
+typedef NativeClang_codeCompleteGetContexts = pkg_ffi.UnsignedLongLong Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetContexts = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef NativeClang_codeCompleteGetContainerKind = ffi.Int32 Function(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete);
+    ffi.Pointer<pkg_ffi.UnsignedInt> IsIncomplete);
 typedef DartClang_codeCompleteGetContainerKind = int Function(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete);
+    ffi.Pointer<pkg_ffi.UnsignedInt> IsIncomplete);
 typedef NativeClang_codeCompleteGetContainerUSR = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
 typedef DartClang_codeCompleteGetContainerUSR = CXString Function(
@@ -10391,7 +10442,7 @@
 typedef NativeClang_getClangVersion = CXString Function();
 typedef DartClang_getClangVersion = CXString Function();
 typedef NativeClang_toggleCrashRecovery = ffi.Void Function(
-    ffi.Uint32 isEnabled);
+    pkg_ffi.UnsignedInt isEnabled);
 typedef DartClang_toggleCrashRecovery = void Function(int isEnabled);
 
 /// Visitor invoked for each file in a translation unit
@@ -10405,8 +10456,8 @@
 /// the first element refers to the location that included 'included_file'.
 typedef CXInclusionVisitor = ffi.Pointer<
     ffi.NativeFunction<
-        ffi.Void Function(
-            CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;
+        ffi.Void Function(CXFile, ffi.Pointer<CXSourceLocation>,
+            pkg_ffi.UnsignedInt, CXClientData)>>;
 typedef NativeClang_getInclusions = ffi.Void Function(
     CXTranslationUnit tu, CXInclusionVisitor visitor, CXClientData client_data);
 typedef DartClang_getInclusions = void Function(
@@ -10429,23 +10480,23 @@
 
 typedef NativeClang_EvalResult_getKind = ffi.Int32 Function(CXEvalResult E);
 typedef DartClang_EvalResult_getKind = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsInt = ffi.Int32 Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsInt = pkg_ffi.Int Function(CXEvalResult E);
 typedef DartClang_EvalResult_getAsInt = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsLongLong = ffi.Int64 Function(
+typedef NativeClang_EvalResult_getAsLongLong = pkg_ffi.LongLong Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_getAsLongLong = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
+typedef NativeClang_EvalResult_isUnsignedInt = pkg_ffi.UnsignedInt Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_isUnsignedInt = int Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
-    CXEvalResult E);
+typedef NativeClang_EvalResult_getAsUnsigned = pkg_ffi.UnsignedLongLong
+    Function(CXEvalResult E);
 typedef DartClang_EvalResult_getAsUnsigned = int Function(CXEvalResult E);
 typedef NativeClang_EvalResult_getAsDouble = ffi.Double Function(
     CXEvalResult E);
 typedef DartClang_EvalResult_getAsDouble = double Function(CXEvalResult E);
-typedef NativeClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_EvalResult_getAsStr = ffi.Pointer<pkg_ffi.Char> Function(
     CXEvalResult E);
-typedef DartClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_EvalResult_getAsStr = ffi.Pointer<pkg_ffi.Char> Function(
     CXEvalResult E);
 typedef NativeClang_EvalResult_dispose = ffi.Void Function(CXEvalResult E);
 typedef DartClang_EvalResult_dispose = void Function(CXEvalResult E);
@@ -10453,18 +10504,20 @@
 /// A remapping of original source files and their translated files.
 typedef CXRemapping = ffi.Pointer<ffi.Void>;
 typedef NativeClang_getRemappings = CXRemapping Function(
-    ffi.Pointer<ffi.Int8> path);
+    ffi.Pointer<pkg_ffi.Char> path);
 typedef DartClang_getRemappings = CXRemapping Function(
-    ffi.Pointer<ffi.Int8> path);
+    ffi.Pointer<pkg_ffi.Char> path);
 typedef NativeClang_getRemappingsFromFileList = CXRemapping Function(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, ffi.Uint32 numFiles);
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> filePaths,
+    pkg_ffi.UnsignedInt numFiles);
 typedef DartClang_getRemappingsFromFileList = CXRemapping Function(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, int numFiles);
-typedef NativeClang_remap_getNumFiles = ffi.Uint32 Function(CXRemapping arg0);
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> filePaths, int numFiles);
+typedef NativeClang_remap_getNumFiles = pkg_ffi.UnsignedInt Function(
+    CXRemapping arg0);
 typedef DartClang_remap_getNumFiles = int Function(CXRemapping arg0);
 typedef NativeClang_remap_getFilenames = ffi.Void Function(
     CXRemapping arg0,
-    ffi.Uint32 index,
+    pkg_ffi.UnsignedInt index,
     ffi.Pointer<CXString> original,
     ffi.Pointer<CXString> transformed);
 typedef DartClang_remap_getFilenames = void Function(
@@ -10518,7 +10571,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -10528,20 +10581,20 @@
   external CXIdxLoc hashLoc;
 
   /// Filename as written in the \#include/\#import directive.
-  external ffi.Pointer<ffi.Int8> filename;
+  external ffi.Pointer<pkg_ffi.Char> filename;
 
   /// The actual file that the \#include/\#import directive resolved to.
   external CXFile file;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImport;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isAngled;
 
   /// Non-zero if the directive was automatically turned into a module
   /// import.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isModuleImport;
 }
 
@@ -10558,7 +10611,7 @@
 
   /// Non-zero if an inclusion directive was automatically turned into
   /// a module import. Applicable only for modules.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImplicit;
 }
 
@@ -10588,15 +10641,15 @@
   @ffi.Int32()
   external int lang;
 
-  external ffi.Pointer<ffi.Int8> name;
+  external ffi.Pointer<pkg_ffi.Char> name;
 
-  external ffi.Pointer<ffi.Int8> USR;
+  external ffi.Pointer<pkg_ffi.Char> USR;
 
   external CXCursor cursor;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numAttributes;
 }
 
@@ -10680,28 +10733,28 @@
   /// cases like out-of-line C++ member functions.
   external ffi.Pointer<CXIdxContainerInfo> lexicalContainer;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isRedeclaration;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isDefinition;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isContainer;
 
   external ffi.Pointer<CXIdxContainerInfo> declAsContainer;
 
   /// Whether the declaration exists in code or was created implicitly
   /// by the compiler, e.g. implicit Objective-C methods for properties.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImplicit;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numAttributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int flags;
 }
 
@@ -10737,7 +10790,7 @@
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
   external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numProtocols;
 }
 
@@ -10774,7 +10827,7 @@
 
   external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numBases;
 }
 
@@ -10840,7 +10893,7 @@
   static const int CXSymbolRole_Implicit = 256;
 }
 
-typedef NativeClang_index_isEntityObjCContainerKind = ffi.Int32 Function(
+typedef NativeClang_index_isEntityObjCContainerKind = pkg_ffi.Int Function(
     ffi.Int32 arg0);
 typedef DartClang_index_isEntityObjCContainerKind = int Function(int arg0);
 typedef NativeClang_index_getObjCContainerDeclInfo
@@ -10922,8 +10975,9 @@
   /// Called periodically to check whether indexing should be aborted.
   /// Should return 0 to continue, and non-zero to abort.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(CXClientData, ffi.Pointer<ffi.Void>)>> abortQuery;
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(CXClientData, ffi.Pointer<ffi.Void>)>>
+      abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
   external ffi.Pointer<
@@ -10980,64 +11034,64 @@
 /// The client's data object that is associated with an AST file (PCH
 /// or module).
 typedef CXIdxClientASTFile = ffi.Pointer<ffi.Void>;
-typedef NativeClang_indexSourceFile = ffi.Int32 Function(
+typedef NativeClang_indexSourceFile = pkg_ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    pkg_ffi.UnsignedInt index_callbacks_size,
+    pkg_ffi.UnsignedInt index_options,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
+    pkg_ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
+    pkg_ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
-    ffi.Uint32 TU_options);
+    pkg_ffi.UnsignedInt TU_options);
 typedef DartClang_indexSourceFile = int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
     int TU_options);
-typedef NativeClang_indexSourceFileFullArgv = ffi.Int32 Function(
+typedef NativeClang_indexSourceFileFullArgv = pkg_ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
+    pkg_ffi.UnsignedInt index_callbacks_size,
+    pkg_ffi.UnsignedInt index_options,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
+    pkg_ffi.Int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
+    pkg_ffi.UnsignedInt num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
-    ffi.Uint32 TU_options);
+    pkg_ffi.UnsignedInt TU_options);
 typedef DartClang_indexSourceFileFullArgv = int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
     int TU_options);
-typedef NativeClang_indexTranslationUnit = ffi.Int32 Function(
+typedef NativeClang_indexTranslationUnit = pkg_ffi.Int Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
+    pkg_ffi.UnsignedInt index_callbacks_size,
+    pkg_ffi.UnsignedInt index_options,
     CXTranslationUnit arg5);
 typedef DartClang_indexTranslationUnit = int Function(
     CXIndexAction arg0,
@@ -11050,16 +11104,16 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef DartClang_indexLoc_getFileLocation = void Function(
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset);
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset);
 typedef NativeClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
     CXIdxLoc loc);
 typedef DartClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
@@ -11076,7 +11130,7 @@
 /// to direct \c clang_Type_visitFields.
 typedef CXFieldVisitor = ffi
     .Pointer<ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXClientData)>>;
-typedef NativeClang_Type_visitFields = ffi.Uint32 Function(
+typedef NativeClang_Type_visitFields = pkg_ffi.UnsignedInt Function(
     CXType T, CXFieldVisitor visitor, CXClientData client_data);
 typedef DartClang_Type_visitFields = int Function(
     CXType T, CXFieldVisitor visitor, CXClientData client_data);
diff --git a/pkgs/ffigen/example/libclang-example/pubspec.yaml b/pkgs/ffigen/example/libclang-example/pubspec.yaml
index f10498b..677e3c9 100644
--- a/pkgs/ffigen/example/libclang-example/pubspec.yaml
+++ b/pkgs/ffigen/example/libclang-example/pubspec.yaml
@@ -5,8 +5,10 @@
 name: libclang_example
 
 environment:
-  sdk: '>=2.13.0 <3.0.0'
+  sdk: '>=2.16.0-124.0.dev <3.0.0'
 
+dependencies:
+  ffi: ^1.2.0-dev.0
 dev_dependencies:
   ffigen:
     path: '../../'
@@ -51,25 +53,30 @@
       - 'CXTypeKind' # Full names are given higher priority than regexp.
       - 'CXGlobalOptFlags'
 
-  # These are optional and also default,
-  # Omitting any and the default will be used.
-  size-map:
-    char: 1
-    unsigned char: 1
-    short: 2
-    unsigned short: 2
-    int: 4
-    unsigned int: 4
-    long: 8
-    unsigned long: 8
-    long long: 8
-    unsigned long long: 8
-    enum: 4
+  library-imports:
+    custom_import: 'custom_import.dart'
 
   # These can be used to map any typedef to a specific native type.
-  typedef-map:
-    'size_t': 'IntPtr'
-    'time_t': 'Int64'
+  type-map:
+    typedefs:
+      'size_t':
+        lib: 'pkg_ffi'
+        c-type: 'Size'
+        dart-type: 'int'
+      'time_t':
+        lib: 'ffi'
+        c-type: 'Int64'
+        dart-type: 'int'
+    native-types:
+      'unsigned long':
+        lib: 'custom_import'
+        c-type: 'UnsignedLong'
+        dart-type: 'int'
+    structs:
+      'CXCursorSetImpl':
+        lib: 'custom_import'
+        c-type: 'CXCursorSetImpl'
+        dart-type: 'CXCursorSetImpl'
 
   # Default is 'NativeLibrary'
   name: 'LibClang'
diff --git a/pkgs/ffigen/example/simple/generated_bindings.dart b/pkgs/ffigen/example/simple/generated_bindings.dart
index 6685438..60c8a12 100644
--- a/pkgs/ffigen/example/simple/generated_bindings.dart
+++ b/pkgs/ffigen/example/simple/generated_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Bindings to `headers/example.h`.
 class NativeLibrary {
@@ -30,14 +31,14 @@
     );
   }
 
-  late final _sumPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32, ffi.Int32)>>(
-          'sum');
+  late final _sumPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int, pkg_ffi.Int)>>(
+      'sum');
   late final _sum = _sumPtr.asFunction<int Function(int, int)>();
 
   /// Subtracts 2 integers.
   int subtract(
-    ffi.Pointer<ffi.Int32> a,
+    ffi.Pointer<pkg_ffi.Int> a,
     int b,
   ) {
     return _subtract(
@@ -48,12 +49,13 @@
 
   late final _subtractPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int32>, ffi.Int32)>>('subtract');
+          pkg_ffi.Int Function(
+              ffi.Pointer<pkg_ffi.Int>, pkg_ffi.Int)>>('subtract');
   late final _subtract =
-      _subtractPtr.asFunction<int Function(ffi.Pointer<ffi.Int32>, int)>();
+      _subtractPtr.asFunction<int Function(ffi.Pointer<pkg_ffi.Int>, int)>();
 
   /// Multiplies 2 integers, returns pointer to an integer,.
-  ffi.Pointer<ffi.Int32> multiply(
+  ffi.Pointer<pkg_ffi.Int> multiply(
     int a,
     int b,
   ) {
@@ -65,9 +67,10 @@
 
   late final _multiplyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int32> Function(ffi.Int32, ffi.Int32)>>('multiply');
+          ffi.Pointer<pkg_ffi.Int> Function(
+              pkg_ffi.Int, pkg_ffi.Int)>>('multiply');
   late final _multiply =
-      _multiplyPtr.asFunction<ffi.Pointer<ffi.Int32> Function(int, int)>();
+      _multiplyPtr.asFunction<ffi.Pointer<pkg_ffi.Int> Function(int, int)>();
 
   /// Divides 2 integers, returns pointer to a float.
   ffi.Pointer<ffi.Float> divide(
@@ -82,7 +85,7 @@
 
   late final _dividePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Float> Function(ffi.Int32, ffi.Int32)>>('divide');
+          ffi.Pointer<ffi.Float> Function(pkg_ffi.Int, pkg_ffi.Int)>>('divide');
   late final _divide =
       _dividePtr.asFunction<ffi.Pointer<ffi.Float> Function(int, int)>();
 
diff --git a/pkgs/ffigen/example/simple/pubspec.yaml b/pkgs/ffigen/example/simple/pubspec.yaml
index e419d1c..b7b8823 100644
--- a/pkgs/ffigen/example/simple/pubspec.yaml
+++ b/pkgs/ffigen/example/simple/pubspec.yaml
@@ -7,6 +7,8 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
+dependencies:
+  ffi: ^1.2.0-dev.0
 dev_dependencies:
   ffigen:
     path: '../../'
diff --git a/pkgs/ffigen/lib/src/code_generator.dart b/pkgs/ffigen/lib/src/code_generator.dart
index 710b32f..0e175e6 100644
--- a/pkgs/ffigen/lib/src/code_generator.dart
+++ b/pkgs/ffigen/lib/src/code_generator.dart
@@ -11,6 +11,7 @@
 export 'code_generator/enum_class.dart';
 export 'code_generator/func.dart';
 export 'code_generator/global.dart';
+export 'code_generator/imports.dart';
 export 'code_generator/library.dart';
 export 'code_generator/struc.dart';
 export 'code_generator/type.dart';
diff --git a/pkgs/ffigen/lib/src/code_generator/imports.dart b/pkgs/ffigen/lib/src/code_generator/imports.dart
new file mode 100644
index 0000000..7a92aa3
--- /dev/null
+++ b/pkgs/ffigen/lib/src/code_generator/imports.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library import which will be written as an import in the generated file.
+class LibraryImport {
+  final String name;
+  final String importPath;
+  String prefix;
+
+  LibraryImport(this.name, this.importPath) : prefix = name;
+
+  @override
+  bool operator ==(other) {
+    return other is LibraryImport && name == other.name;
+  }
+
+  @override
+  int get hashCode => name.hashCode;
+}
+
+/// An imported type which will be used in the generated code.
+class ImportedType {
+  final LibraryImport libraryImport;
+  final String cType;
+  final String dartType;
+
+  ImportedType(this.libraryImport, this.cType, this.dartType);
+}
+
+final ffiImport = LibraryImport('ffi', 'dart:ffi');
+final ffiPkgImport = LibraryImport('pkg_ffi', 'package:ffi/ffi.dart');
+
+final voidType = ImportedType(ffiImport, 'Void', 'void');
+
+final unsignedCharType = ImportedType(ffiPkgImport, 'UnsignedChar', 'int');
+final signedCharType = ImportedType(ffiPkgImport, 'SignedChar', 'int');
+final charType = ImportedType(ffiPkgImport, 'Char', 'int');
+final unsignedShortType = ImportedType(ffiPkgImport, 'UnsignedShort', 'int');
+final shortType = ImportedType(ffiPkgImport, 'Short', 'int');
+final unsignedIntType = ImportedType(ffiPkgImport, 'UnsignedInt', 'int');
+final intType = ImportedType(ffiPkgImport, 'Int', 'int');
+final unsignedLongType = ImportedType(ffiPkgImport, 'UnsignedLong', 'int');
+final longType = ImportedType(ffiPkgImport, 'Long', 'int');
+final unsignedLongLongType =
+    ImportedType(ffiPkgImport, 'UnsignedLongLong', 'int');
+final longLongType = ImportedType(ffiPkgImport, 'LongLong', 'int');
+
+final floatType = ImportedType(ffiImport, 'Float', 'double');
+final doubleType = ImportedType(ffiImport, 'Double', 'double');
+
+final sizeType = ImportedType(ffiPkgImport, 'Size', 'Size');
+final sSizeType = ImportedType(ffiPkgImport, 'SSize', 'SSize');
+final offType = ImportedType(ffiPkgImport, 'Off', 'Off');
+final wCharType = ImportedType(ffiPkgImport, 'WChar', 'WChar');
diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart
index 080f099..20c0e24 100644
--- a/pkgs/ffigen/lib/src/code_generator/library.dart
+++ b/pkgs/ffigen/lib/src/code_generator/library.dart
@@ -6,9 +6,11 @@
 
 import 'package:cli_util/cli_util.dart';
 import 'package:ffigen/src/config_provider/config_types.dart';
+import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
 import 'package:path/path.dart' as p;
 import 'binding.dart';
+import 'imports.dart';
 import 'struc.dart';
 import 'utils.dart';
 import 'writer.dart';
@@ -31,6 +33,7 @@
     bool dartBool = true,
     bool sort = false,
     StructPackingOverride? packingOverride,
+    Set<LibraryImport>? libraryImports,
   }) {
     /// Get all dependencies (includes itself).
     final dependencies = <Binding>{};
@@ -67,6 +70,13 @@
     final noLookUpBindings =
         this.bindings.whereType<NoLookUpBinding>().toList();
 
+    // Add predefined imports.
+    final _libraryImports = <LibraryImport>{};
+    _libraryImports.addAll(strings.predefinedLibraryImports.values);
+    if (libraryImports != null) {
+      _libraryImports.addAll(libraryImports);
+    }
+
     _writer = Writer(
       lookUpBindings: lookUpBindings,
       noLookUpBindings: noLookUpBindings,
@@ -74,6 +84,7 @@
       classDocComment: description,
       header: header,
       dartBool: dartBool,
+      libraryImports: _libraryImports,
     );
   }
 
diff --git a/pkgs/ffigen/lib/src/code_generator/type.dart b/pkgs/ffigen/lib/src/code_generator/type.dart
index ba16841..b70b4ec 100644
--- a/pkgs/ffigen/lib/src/code_generator/type.dart
+++ b/pkgs/ffigen/lib/src/code_generator/type.dart
@@ -40,6 +40,9 @@
   /// Represents a function type.
   FunctionType,
 
+  /// Represents an imported type.
+  ImportedType,
+
   /// Represents a typealias.
   Typealias,
 
@@ -92,6 +95,9 @@
   /// Reference to the [EnumClass] this type refers to.
   EnumClass? enumClass;
 
+  /// Reference to the [ImportedType] this type refers to.
+  ImportedType? importedType;
+
   /// For providing [SupportedNativeType] only.
   final SupportedNativeType? nativeType;
 
@@ -116,6 +122,7 @@
     this.nativeFunc,
     this.typealias,
     this.functionType,
+    this.importedType,
     this.length,
     this.unimplementedReason,
   });
@@ -139,6 +146,10 @@
     return Type._(
         broadType: BroadType.FunctionType, functionType: functionType);
   }
+  factory Type.importedType(ImportedType importedType) {
+    return Type._(
+        broadType: BroadType.ImportedType, importedType: importedType);
+  }
   factory Type.nativeFunc(NativeFunc nativeFunc) {
     return Type._(broadType: BroadType.NativeFunction, nativeFunc: nativeFunc);
   }
@@ -270,6 +281,8 @@
         return '${w.ffiLibraryPrefix}.Handle';
       case BroadType.FunctionType:
         return functionType!.getCType(w);
+      case BroadType.ImportedType:
+        return '${importedType!.libraryImport.prefix}.${importedType!.cType}';
       case BroadType.Typealias:
         return typealias!.name;
       case BroadType.Unimplemented:
@@ -301,6 +314,12 @@
         return 'Object';
       case BroadType.FunctionType:
         return functionType!.getDartType(w);
+      case BroadType.ImportedType:
+        if (importedType!.cType == importedType!.dartType) {
+          return getCType(w);
+        } else {
+          return importedType!.dartType;
+        }
       case BroadType.Typealias:
         // Typealias cannot be used by name in Dart types unless both the C and
         // Dart type of the underlying types are same.
diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart
index 2b9a0c9..0fd7515 100644
--- a/pkgs/ffigen/lib/src/code_generator/writer.dart
+++ b/pkgs/ffigen/lib/src/code_generator/writer.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator/imports.dart';
 import 'package:ffigen/src/code_generator/utils.dart';
 
 import 'binding.dart';
@@ -22,8 +23,15 @@
   late String _className;
   final String? classDocComment;
 
-  late String _ffiLibraryPrefix;
-  String get ffiLibraryPrefix => _ffiLibraryPrefix;
+  String? _ffiLibraryPrefix;
+  String get ffiLibraryPrefix {
+    _ffiLibraryPrefix ??= libraryImports
+        .firstWhere((element) => element.name == ffiImport.name)
+        .prefix;
+    return _ffiLibraryPrefix!;
+  }
+
+  final Set<LibraryImport> libraryImports;
 
   late String _lookupFuncIdentifier;
   String get lookupFuncIdentifier => _lookupFuncIdentifier;
@@ -55,6 +63,7 @@
     required this.noLookUpBindings,
     required String className,
     required this.dartBool,
+    required this.libraryImports,
     this.classDocComment,
     this.header,
   }) {
@@ -75,12 +84,17 @@
       markUsed: [_initialWrapperLevelUniqueNamer, _initialTopLevelUniqueNamer],
     );
 
-    /// [_ffiLibraryPrefix] should be unique unique among all names.
-    _ffiLibraryPrefix = _resolveNameConflict(
-      name: 'ffi',
-      makeUnique: allLevelsUniqueNamer,
-      markUsed: [_initialWrapperLevelUniqueNamer, _initialTopLevelUniqueNamer],
-    );
+    /// Library imports prefix should be unique unique among all names.
+    for (final lib in libraryImports) {
+      lib.prefix = _resolveNameConflict(
+        name: lib.prefix,
+        makeUnique: allLevelsUniqueNamer,
+        markUsed: [
+          _initialWrapperLevelUniqueNamer,
+          _initialTopLevelUniqueNamer
+        ],
+      );
+    }
 
     /// [_lookupFuncIdentifier] should be unique in top level.
     _lookupFuncIdentifier = _resolveNameConflict(
@@ -161,8 +175,10 @@
         'AUTO GENERATED FILE, DO NOT EDIT.\n\nGenerated by `package:ffigen`.'));
 
     // Write neccesary imports.
-    s.write("import 'dart:ffi' as $ffiLibraryPrefix;\n");
-    s.write('\n');
+    for (final lib in libraryImports) {
+      s.write("import '${lib.importPath}' as ${lib.prefix};");
+      s.write('\n');
+    }
 
     /// Write [lookUpBindings].
     if (lookUpBindings.isNotEmpty) {
diff --git a/pkgs/ffigen/lib/src/config_provider/config.dart b/pkgs/ffigen/lib/src/config_provider/config.dart
index 88d5d8d..7acb2c8 100644
--- a/pkgs/ffigen/lib/src/config_provider/config.dart
+++ b/pkgs/ffigen/lib/src/config_provider/config.dart
@@ -5,7 +5,6 @@
 /// Validates the yaml input by the user, prints useful info for the user
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:ffigen/src/header_parser/type_extractor/cxtypekindmap.dart';
 
 import 'package:logging/logging.dart';
 import 'package:yaml/yaml.dart';
@@ -75,10 +74,25 @@
   bool get useSupportedTypedefs => _useSupportedTypedefs;
   late bool _useSupportedTypedefs;
 
-  /// Stores typedef name to NativeType mappings specified by user.
-  Map<String, SupportedNativeType> get typedefNativeTypeMappings =>
-      _typedefNativeTypeMappings;
-  late Map<String, SupportedNativeType> _typedefNativeTypeMappings;
+  /// Stores all the library imports specified by user including those for ffi and pkg_ffi.
+  Map<String, LibraryImport> get libraryImports => _libraryImports;
+  late Map<String, LibraryImport> _libraryImports;
+
+  /// Stores typedef name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get typedefTypeMappings => _typedefTypeMappings;
+  late Map<String, ImportedType> _typedefTypeMappings;
+
+  /// Stores struct name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get structTypeMappings => _structTypeMappings;
+  late Map<String, ImportedType> _structTypeMappings;
+
+  /// Stores union name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get unionTypeMappings => _unionTypeMappings;
+  late Map<String, ImportedType> _unionTypeMappings;
+
+  /// Stores native int name to ImportedType mappings specified by user.
+  Map<String, ImportedType> get nativeTypeMappings => _nativeTypeMappings;
+  late Map<String, ImportedType> _nativeTypeMappings;
 
   /// Extracted Doc comment type.
   CommentType get commentType => _commentType;
@@ -167,12 +181,7 @@
       }
     }
     // Warn about unknown keys.
-    for (final key in map.keys) {
-      final specString = specs.keys.map((e) => e.join(':')).toSet();
-      if (!specString.contains(key)) {
-        _logger.warning("Unknown key '$key' found.");
-      }
-    }
+    warnUnknownKeys(specs.keys.toList(), map);
 
     return _result;
   }
@@ -305,25 +314,53 @@
           _typedefs = result as Declaration;
         },
       ),
-      [strings.sizemap]: Specification<Map<int, SupportedNativeType>>(
-        validator: sizemapValidator,
-        extractor: sizemapExtractor,
-        defaultValue: () => <int, SupportedNativeType>{},
+      [strings.libraryImports]: Specification<Map<String, LibraryImport>>(
+        validator: libraryImportsValidator,
+        extractor: libraryImportsExtractor,
+        defaultValue: () => <String, LibraryImport>{},
         extractedResult: (dynamic result) {
-          final map = result as Map<int, SupportedNativeType>;
-          for (final key in map.keys) {
-            if (cxTypeKindToSupportedNativeTypes.containsKey(key)) {
-              cxTypeKindToSupportedNativeTypes[key] = map[key]!;
-            }
-          }
+          _libraryImports = result as Map<String, LibraryImport>;
         },
       ),
-      [strings.typedefmap]: Specification<Map<String, SupportedNativeType>>(
-        validator: typedefmapValidator,
-        extractor: typedefmapExtractor,
-        defaultValue: () => <String, SupportedNativeType>{},
-        extractedResult: (dynamic result) => _typedefNativeTypeMappings =
-            result as Map<String, SupportedNativeType>,
+      [strings.typeMap, strings.typeMapTypedefs]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _typedefTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapStructs]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _structTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapUnions]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _unionTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
+      ),
+      [strings.typeMap, strings.typeMapNativeTypes]:
+          Specification<Map<String, List<String>>>(
+        validator: typeMapValidator,
+        extractor: typeMapExtractor,
+        defaultValue: () => <String, List<String>>{},
+        extractedResult: (dynamic result) {
+          _nativeTypeMappings = makeImportTypeMapping(
+              result as Map<String, List<String>>, _libraryImports);
+        },
       ),
       [strings.sort]: Specification<bool>(
         requirement: Requirement.no,
diff --git a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
index 22a6e1a..e5f0f41 100644
--- a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
+++ b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
@@ -65,69 +65,139 @@
   return null;
 }
 
+/// Recursively checks the keys in [configKeyMap] from [allowedKeyList].
+void warnUnknownKeys(List<List<String>> allowedKeyList, YamlMap configKeyMap) {
+  final allowedKeyMap = <String, dynamic>{};
+  for (final specKeys in allowedKeyList) {
+    var _item = allowedKeyMap;
+    for (final specSubKey in specKeys) {
+      _item.putIfAbsent(specSubKey, () => <String, dynamic>{});
+      _item = _item[specSubKey] as Map<String, dynamic>;
+    }
+    // Add empty key to mark that any sub-keys of this key are allowed.
+    _item[''] = <String, dynamic>{};
+  }
+  _warnUnknownKeysInMap(allowedKeyMap, configKeyMap, <dynamic>[]);
+}
+
+/// Recursive function to check a key set in a configKeyMap.
+void _warnUnknownKeysInMap(Map<String, dynamic> allowedKeyMap,
+    dynamic configKeyMap, List<dynamic> prev) {
+  if (allowedKeyMap.containsKey('') || configKeyMap is! YamlMap) {
+    return;
+  }
+  for (final key in configKeyMap.keys) {
+    if (allowedKeyMap.containsKey(key)) {
+      prev.add(key);
+      _warnUnknownKeysInMap(
+          allowedKeyMap[key] as Map<String, dynamic>, configKeyMap[key], prev);
+      prev.removeLast();
+    } else {
+      prev.add(key);
+      _logger.warning('Unknown key - ${prev.join(' -> ')}.');
+      prev.removeLast();
+    }
+  }
+}
+
 bool booleanExtractor(dynamic value) => value as bool;
 
 bool booleanValidator(List<String> name, dynamic value) =>
     checkType<bool>(name, value);
 
-Map<int, SupportedNativeType> sizemapExtractor(dynamic yamlConfig) {
-  final resultMap = <int, SupportedNativeType>{};
-  final sizemap = yamlConfig as YamlMap?;
-  if (sizemap != null) {
-    for (final typeName in strings.sizemap_native_mapping.keys) {
-      if (sizemap.containsKey(typeName)) {
-        final cxTypeInt = strings.sizemap_native_mapping[typeName] as int;
-        final byteSize = sizemap[typeName] as int;
-        resultMap[cxTypeInt] = nativeSupportedType(byteSize,
-            signed: typeName.contains('unsigned') ? false : true);
-      }
+Map<String, LibraryImport> libraryImportsExtractor(dynamic yamlConfig) {
+  final resultMap = <String, LibraryImport>{};
+  final typeMap = yamlConfig as YamlMap?;
+  if (typeMap != null) {
+    for (final typeName in typeMap.keys) {
+      resultMap[typeName as String] =
+          LibraryImport(typeName, typeMap[typeName] as String);
     }
   }
   return resultMap;
 }
 
-bool sizemapValidator(List<String> name, dynamic yamlConfig) {
+bool libraryImportsValidator(List<String> name, dynamic yamlConfig) {
   if (!checkType<YamlMap>(name, yamlConfig)) {
     return false;
   }
   for (final key in (yamlConfig as YamlMap).keys) {
-    if (!strings.sizemap_native_mapping.containsKey(key)) {
-      _logger.warning("Unknown subkey '$key' in '$name'.");
+    if (!checkType<String>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+    if (strings.predefinedLibraryImports.containsKey(key)) {
+      _logger.severe(
+          'library-import -> $key should not collide with any predefined imports - ${strings.predefinedLibraryImports.keys}.');
+      return false;
     }
   }
-
   return true;
 }
 
-Map<String, SupportedNativeType> typedefmapExtractor(dynamic yamlConfig) {
-  final resultMap = <String, SupportedNativeType>{};
-  final typedefmap = yamlConfig as YamlMap?;
-  if (typedefmap != null) {
-    for (final typeName in typedefmap.keys) {
-      if (typedefmap[typeName] is String &&
-          strings.supportedNativeType_mappings
-              .containsKey(typedefmap[typeName])) {
-        // Map this typename to specified supportedNativeType.
-        resultMap[typeName as String] =
-            strings.supportedNativeType_mappings[typedefmap[typeName]]!;
-      }
+Map<String, List<String>> typeMapExtractor(dynamic yamlConfig) {
+  // Key - type_name, Value - [lib, cType, dartType].
+  final resultMap = <String, List<String>>{};
+  final typeMap = yamlConfig as YamlMap?;
+  if (typeMap != null) {
+    for (final typeName in typeMap.keys) {
+      final typeConfigItem = typeMap[typeName] as YamlMap;
+      resultMap[typeName as String] = [
+        typeConfigItem[strings.lib] as String,
+        typeConfigItem[strings.cType] as String,
+        typeConfigItem[strings.dartType] as String,
+      ];
     }
   }
   return resultMap;
 }
 
-bool typedefmapValidator(List<String> name, dynamic yamlConfig) {
+bool typeMapValidator(List<String> name, dynamic yamlConfig) {
   if (!checkType<YamlMap>(name, yamlConfig)) {
     return false;
   }
-  for (final value in (yamlConfig as YamlMap).values) {
-    if (value is! String ||
-        !strings.supportedNativeType_mappings.containsKey(value)) {
-      _logger.severe("Unknown value of subkey '$value' in '$name'.");
+  var result = true;
+  for (final key in (yamlConfig as YamlMap).keys) {
+    if (!checkType<YamlMap>([...name, key as String], yamlConfig[key])) {
+      return false;
+    }
+    final lib = (yamlConfig[key] as YamlMap).containsKey(strings.lib);
+    if (!lib) {
+      _logger.severe("Key '${strings.lib}' in $name -> $key is required.");
+      result = false;
+    }
+    final cType = (yamlConfig[key] as YamlMap).containsKey(strings.cType);
+    if (!cType) {
+      _logger.severe("Key '${strings.cType}' in $name -> $key is required.");
+      result = false;
+    }
+    final dartType = (yamlConfig[key] as YamlMap).containsKey(strings.dartType);
+    if (!dartType) {
+      _logger.severe("Key '${strings.dartType}' in $name -> $key is required.");
+      result = false;
     }
   }
+  return result;
+}
 
-  return true;
+Map<String, ImportedType> makeImportTypeMapping(
+    Map<String, List<String>> rawTypeMappings,
+    Map<String, LibraryImport> libraryImportsMap) {
+  final typeMappings = <String, ImportedType>{};
+  for (final key in rawTypeMappings.keys) {
+    final lib = rawTypeMappings[key]![0];
+    final cType = rawTypeMappings[key]![1];
+    final dartType = rawTypeMappings[key]![2];
+    if (strings.predefinedLibraryImports.containsKey(lib)) {
+      typeMappings[key] =
+          ImportedType(strings.predefinedLibraryImports[lib]!, cType, dartType);
+    } else if (libraryImportsMap.containsKey(lib)) {
+      typeMappings[key] =
+          ImportedType(libraryImportsMap[lib]!, cType, dartType);
+    } else {
+      throw Exception("Please declare $lib under library-imports.");
+    }
+  }
+  return typeMappings;
 }
 
 final _quoteMatcher = RegExp(r'''^["'](.*)["']$''', dotAll: true);
@@ -516,7 +586,7 @@
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
           _result = false;
         } else {
-          for (final subkey in value[key].keys) {
+          for (final subkey in (value[key] as YamlMap).keys) {
             if (!checkType<String>(
                 [...name, key, subkey as String], value[key][subkey])) {
               _result = false;
@@ -527,12 +597,13 @@
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
           _result = false;
         } else {
-          for (final declNameKey in value[key].keys) {
+          for (final declNameKey in (value[key] as YamlMap).keys) {
             if (!checkType<YamlMap>([...name, key, declNameKey as String],
                 value[key][declNameKey])) {
               _result = false;
             } else {
-              for (final memberNameKey in value[key][declNameKey].keys) {
+              for (final memberNameKey
+                  in ((value[key] as YamlMap)[declNameKey] as YamlMap).keys) {
                 if (!checkType<String>([
                   ...name,
                   key,
@@ -549,7 +620,7 @@
         if (!checkType<YamlMap>([...name, key as String], value[key])) {
           _result = false;
         } else {
-          for (final subkey in value[key].keys) {
+          for (final subkey in (value[key] as YamlMap).keys) {
             if (subkey == strings.include || subkey == strings.exclude) {
               if (!checkType<YamlList>(
                   [...name, key, subkey as String], value[key][subkey])) {
@@ -741,7 +812,7 @@
 
 StructPackingOverride structPackingOverrideExtractor(dynamic value) {
   final matcherMap = <RegExp, int?>{};
-  for (final key in value.keys) {
+  for (final key in (value as YamlMap).keys) {
     matcherMap[RegExp(key as String, dotAll: true)] =
         strings.packingValuesMap[value[key]];
   }
@@ -754,7 +825,7 @@
   if (!checkType<YamlMap>([...name], value)) {
     _result = false;
   } else {
-    for (final key in value.keys) {
+    for (final key in (value as YamlMap).keys) {
       if (!(strings.packingValuesMap.keys.contains(value[key]))) {
         _logger.severe(
             "'$name -> $key' must be one of the following - ${strings.packingValuesMap.keys.toList()}");
diff --git a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
index abfad7f..2c0c33f 100644
--- a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -9,6 +9,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Holds bindings to LibClang.
 class Clang {
@@ -26,7 +27,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<pkg_ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -35,10 +36,10 @@
   }
 
   late final _clang_getCStringPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXString)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(CXString)>>(
           'clang_getCString');
   late final _clang_getCString = _clang_getCStringPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(CXString)>();
 
   /// Free the given string.
   void clang_disposeString(
@@ -104,7 +105,7 @@
   }
 
   late final _clang_createIndexPtr =
-      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int32, ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<CXIndex Function(pkg_ffi.Int, pkg_ffi.Int)>>(
           'clang_createIndex');
   late final _clang_createIndex =
       _clang_createIndexPtr.asFunction<CXIndex Function(int, int)>();
@@ -157,7 +158,7 @@
 
   late final _clang_equalRangesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXSourceRange, CXSourceRange)>>('clang_equalRanges');
   late final _clang_equalRanges = _clang_equalRangesPtr
       .asFunction<int Function(CXSourceRange, CXSourceRange)>();
@@ -186,9 +187,9 @@
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -204,16 +205,16 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getFileLocation');
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getFileLocation');
   late final _clang_getFileLocation = _clang_getFileLocationPtr.asFunction<
       void Function(
           CXSourceLocation,
           ffi.Pointer<CXFile>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>)>();
+          ffi.Pointer<pkg_ffi.UnsignedInt>,
+          ffi.Pointer<pkg_ffi.UnsignedInt>,
+          ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Determine the number of diagnostics produced for the given
   /// translation unit.
@@ -225,9 +226,9 @@
     );
   }
 
-  late final _clang_getNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
-          'clang_getNumDiagnostics');
+  late final _clang_getNumDiagnosticsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXTranslationUnit)>>(
+      'clang_getNumDiagnostics');
   late final _clang_getNumDiagnostics =
       _clang_getNumDiagnosticsPtr.asFunction<int Function(CXTranslationUnit)>();
 
@@ -251,7 +252,7 @@
   late final _clang_getDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(
-              CXTranslationUnit, ffi.Uint32)>>('clang_getDiagnostic');
+              CXTranslationUnit, pkg_ffi.UnsignedInt)>>('clang_getDiagnostic');
   late final _clang_getDiagnostic = _clang_getDiagnosticPtr
       .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();
 
@@ -293,9 +294,10 @@
     );
   }
 
-  late final _clang_formatDiagnosticPtr =
-      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.Uint32)>>(
-          'clang_formatDiagnostic');
+  late final _clang_formatDiagnosticPtr = _lookup<
+      ffi.NativeFunction<
+          CXString Function(
+              CXDiagnostic, pkg_ffi.UnsignedInt)>>('clang_formatDiagnostic');
   late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr
       .asFunction<CXString Function(CXDiagnostic, int)>();
 
@@ -305,8 +307,8 @@
   /// error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -327,18 +329,18 @@
       ffi.NativeFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_parseTranslationUnit');
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>>('clang_parseTranslationUnit');
   late final _clang_parseTranslationUnit =
       _clang_parseTranslationUnitPtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -388,7 +390,7 @@
   }
 
   late final _clang_Cursor_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isNull');
   late final _clang_Cursor_isNull =
       _clang_Cursor_isNullPtr.asFunction<int Function(CXCursor)>();
@@ -418,7 +420,7 @@
   }
 
   late final _clang_Cursor_hasAttrsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_hasAttrs');
   late final _clang_Cursor_hasAttrs =
       _clang_Cursor_hasAttrsPtr.asFunction<int Function(CXCursor)>();
@@ -512,7 +514,7 @@
   }
 
   late final _clang_getEnumConstantDeclValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclValue');
   late final _clang_getEnumConstantDeclValue =
       _clang_getEnumConstantDeclValuePtr.asFunction<int Function(CXCursor)>();
@@ -529,7 +531,7 @@
   }
 
   late final _clang_getFieldDeclBitWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_getFieldDeclBitWidth');
   late final _clang_getFieldDeclBitWidth =
       _clang_getFieldDeclBitWidthPtr.asFunction<int Function(CXCursor)>();
@@ -548,7 +550,7 @@
   }
 
   late final _clang_Cursor_getNumArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumArguments');
   late final _clang_Cursor_getNumArguments =
       _clang_Cursor_getNumArgumentsPtr.asFunction<int Function(CXCursor)>();
@@ -568,9 +570,9 @@
     );
   }
 
-  late final _clang_Cursor_getArgumentPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getArgument');
+  late final _clang_Cursor_getArgumentPtr = _lookup<
+          ffi.NativeFunction<CXCursor Function(CXCursor, pkg_ffi.UnsignedInt)>>(
+      'clang_Cursor_getArgument');
   late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
 
@@ -605,7 +607,7 @@
   }
 
   late final _clang_Cursor_isMacroFunctionLikePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroFunctionLike');
   late final _clang_Cursor_isMacroFunctionLike =
       _clang_Cursor_isMacroFunctionLikePtr.asFunction<int Function(CXCursor)>();
@@ -621,7 +623,7 @@
   }
 
   late final _clang_Cursor_isMacroBuiltinPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroBuiltin');
   late final _clang_Cursor_isMacroBuiltin =
       _clang_Cursor_isMacroBuiltinPtr.asFunction<int Function(CXCursor)>();
@@ -637,7 +639,7 @@
   }
 
   late final _clang_Cursor_isFunctionInlinedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isFunctionInlined');
   late final _clang_Cursor_isFunctionInlined =
       _clang_Cursor_isFunctionInlinedPtr.asFunction<int Function(CXCursor)>();
@@ -732,7 +734,7 @@
   }
 
   late final _clang_getNumArgTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXType)>>(
           'clang_getNumArgTypes');
   late final _clang_getNumArgTypes =
       _clang_getNumArgTypesPtr.asFunction<int Function(CXType)>();
@@ -752,7 +754,7 @@
   }
 
   late final _clang_getArgTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, pkg_ffi.UnsignedInt)>>(
           'clang_getArgType');
   late final _clang_getArgType =
       _clang_getArgTypePtr.asFunction<CXType Function(CXType, int)>();
@@ -770,7 +772,7 @@
   }
 
   late final _clang_getNumElementsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_getNumElements');
   late final _clang_getNumElements =
       _clang_getNumElementsPtr.asFunction<int Function(CXType)>();
@@ -828,7 +830,7 @@
   }
 
   late final _clang_Type_getAlignOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_Type_getAlignOf');
   late final _clang_Type_getAlignOf =
       _clang_Type_getAlignOfPtr.asFunction<int Function(CXType)>();
@@ -844,7 +846,7 @@
   }
 
   late final _clang_Cursor_isAnonymousPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymous');
   late final _clang_Cursor_isAnonymous =
       _clang_Cursor_isAnonymousPtr.asFunction<int Function(CXCursor)>();
@@ -860,7 +862,7 @@
   }
 
   late final _clang_Cursor_isAnonymousRecordDeclPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymousRecordDecl');
   late final _clang_Cursor_isAnonymousRecordDecl =
       _clang_Cursor_isAnonymousRecordDeclPtr
@@ -900,7 +902,7 @@
 
   late final _clang_visitChildrenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXCursor, CXCursorVisitor, CXClientData)>>('clang_visitChildren');
   late final _clang_visitChildren = _clang_visitChildrenPtr
       .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();
@@ -1096,7 +1098,7 @@
   }
 
   late final _clang_EvalResult_getAsIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXEvalResult)>>(
           'clang_EvalResult_getAsInt');
   late final _clang_EvalResult_getAsInt =
       _clang_EvalResult_getAsIntPtr.asFunction<int Function(CXEvalResult)>();
@@ -1113,7 +1115,7 @@
   }
 
   late final _clang_EvalResult_getAsLongLongPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXEvalResult)>>(
           'clang_EvalResult_getAsLongLong');
   late final _clang_EvalResult_getAsLongLong =
       _clang_EvalResult_getAsLongLongPtr
@@ -1139,7 +1141,7 @@
   /// kind is other than Int or float. User must not free this pointer,
   /// instead call clang_EvalResult_dispose on the CXEvalResult returned
   /// by clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<pkg_ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -1147,11 +1149,11 @@
     );
   }
 
-  late final _clang_EvalResult_getAsStrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>>(
-          'clang_EvalResult_getAsStr');
+  late final _clang_EvalResult_getAsStrPtr = _lookup<
+          ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(CXEvalResult)>>(
+      'clang_EvalResult_getAsStr');
   late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(CXEvalResult)>();
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -1178,7 +1180,7 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int private_flags;
 }
 
@@ -1193,13 +1195,13 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<pkg_ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<pkg_ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @pkg_ffi.UnsignedLong()
   external int Length;
 }
 
@@ -1219,7 +1221,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -1231,10 +1233,10 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int end_int_data;
 }
 
@@ -2225,7 +2227,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
diff --git a/pkgs/ffigen/lib/src/header_parser/parser.dart b/pkgs/ffigen/lib/src/header_parser/parser.dart
index 93dfaa1..ffcfc8f 100644
--- a/pkgs/ffigen/lib/src/header_parser/parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/parser.dart
@@ -31,6 +31,7 @@
     dartBool: config.dartBool,
     sort: config.sort,
     packingOverride: config.structPackingOverride,
+    libraryImports: c.libraryImports.values.toSet(),
   );
 
   return library;
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
index 68bc080..cdfe078 100644
--- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
+++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
@@ -239,7 +239,7 @@
 /// E.g- For a string "Hello\nWorld", The new line character is converted to \n.
 /// Note: The string is considered to be Utf8, but is treated as Extended ASCII,
 /// if the conversion fails.
-String _getWrittenRepresentation(String macroName, Pointer<Int8> strPtr) {
+String _getWrittenRepresentation(String macroName, Pointer<Char> strPtr) {
   final sb = StringBuffer();
   try {
     // Consider string to be Utf8 encoded by default.
diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
index eae99bc..41af99a 100644
--- a/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
+++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/cxtypekindmap.dart
@@ -3,28 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart' show SupportedNativeType;
-import 'package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart'
-    as clang;
+import 'package:ffigen/src/code_generator/imports.dart';
 
-/// Utility to convert CXType to [code_generator.Type].
-///
-/// Key: CXTypekindEnum, Value: TypeString for code_generator
-var cxTypeKindToSupportedNativeTypes = <int, SupportedNativeType>{
-  clang.CXTypeKind.CXType_Void: SupportedNativeType.Void,
-  clang.CXTypeKind.CXType_UChar: SupportedNativeType.Uint8,
-  clang.CXTypeKind.CXType_UShort: SupportedNativeType.Uint16,
-  clang.CXTypeKind.CXType_UInt: SupportedNativeType.Uint32,
-  clang.CXTypeKind.CXType_ULong: SupportedNativeType.Uint64,
-  clang.CXTypeKind.CXType_ULongLong: SupportedNativeType.Uint64,
-  clang.CXTypeKind.CXType_SChar: SupportedNativeType.Int8,
-  clang.CXTypeKind.CXType_Short: SupportedNativeType.Int16,
-  clang.CXTypeKind.CXType_Int: SupportedNativeType.Int32,
-  clang.CXTypeKind.CXType_Long: SupportedNativeType.Int64,
-  clang.CXTypeKind.CXType_LongLong: SupportedNativeType.Int64,
-  clang.CXTypeKind.CXType_Float: SupportedNativeType.Float,
-  clang.CXTypeKind.CXType_Double: SupportedNativeType.Double,
-  clang.CXTypeKind.CXType_Char_S: SupportedNativeType.Int8,
-  clang.CXTypeKind.CXType_Char_U: SupportedNativeType.Uint8,
+var cxTypeKindToImportedTypes = <String, ImportedType>{
+  'void': voidType,
+  'unsigned char': unsignedCharType,
+  'signed char': signedCharType,
+  'char': charType,
+  'unsigned short': unsignedShortType,
+  'short': shortType,
+  'unsigned int': unsignedIntType,
+  'int': intType,
+  'unsigned long': unsignedLongType,
+  'long': longType,
+  'unsigned long long': unsignedLongLongType,
+  'long long': longLongType,
+  'float': floatType,
+  'double': doubleType,
 };
 
 var suportedTypedefToSuportedNativeType = <String, SupportedNativeType>{
@@ -38,3 +33,8 @@
   'int64_t': SupportedNativeType.Int64,
   'intptr_t': SupportedNativeType.IntPtr,
 };
+
+var supportedTypedefToImportedType = <String, ImportedType>{
+  'size_t': sizeType,
+  'wchar_t': wCharType,
+};
diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
index 43d964c..6063035 100644
--- a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
+++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
@@ -43,9 +43,9 @@
       return Type.pointer(s);
     case clang_types.CXTypeKind.CXType_Typedef:
       final spelling = clang.clang_getTypedefName(cxtype).toStringAndDispose();
-      if (config.typedefNativeTypeMappings.containsKey(spelling)) {
-        _logger.fine('  Type Mapped from typedef-map');
-        return Type.nativeType(config.typedefNativeTypeMappings[spelling]!);
+      if (config.typedefTypeMappings.containsKey(spelling)) {
+        _logger.fine('  Type $spelling mapped from type-map');
+        return Type.importedType(config.typedefTypeMappings[spelling]!);
       }
       // Get name from supported typedef name if config allows.
       if (config.useSupportedTypedefs) {
@@ -53,6 +53,9 @@
           _logger.fine('  Type Mapped from supported typedef');
           return Type.nativeType(
               suportedTypedefToSuportedNativeType[spelling]!);
+        } else if (supportedTypedefToImportedType.containsKey(spelling)) {
+          _logger.fine('  Type Mapped from supported typedef');
+          return Type.importedType(supportedTypedefToImportedType[spelling]!);
         }
       }
 
@@ -119,10 +122,16 @@
     case clang_types.CXTypeKind.CXType_Bool:
       return Type.boolean();
     default:
-      if (cxTypeKindToSupportedNativeTypes.containsKey(kind)) {
-        return Type.nativeType(
-          cxTypeKindToSupportedNativeTypes[kind]!,
-        );
+      var typeSpellKey =
+          clang.clang_getTypeSpelling(cxtype).toStringAndDispose();
+      if (typeSpellKey.startsWith('const ')) {
+        typeSpellKey = typeSpellKey.replaceFirst('const ', '');
+      }
+      if (config.nativeTypeMappings.containsKey(typeSpellKey)) {
+        _logger.fine('  Type $typeSpellKey mapped from type-map.');
+        return Type.importedType(config.nativeTypeMappings[typeSpellKey]!);
+      } else if (cxTypeKindToImportedTypes.containsKey(typeSpellKey)) {
+        return Type.importedType(cxTypeKindToImportedTypes[typeSpellKey]!);
       } else {
         _logger.fine(
             'typedeclarationCursorVisitor: getCodeGenType: Type Not Implemented, ${cxtype.completeStringRepr()}');
@@ -142,22 +151,26 @@
   if (cursorKind == clang_types.CXCursorKind.CXCursor_StructDecl ||
       cursorKind == clang_types.CXCursorKind.CXCursor_UnionDecl) {
     final declUsr = cursor.usr();
+    final declSpelling = cursor.spelling();
 
     // Set includer functions according to compoundType.
     final bool Function(String) isSeenDecl;
     final Compound? Function(String) getSeenDecl;
     final CompoundType compoundType;
+    final Map<String, ImportedType> compoundTypeMappings;
 
     switch (cursorKind) {
       case clang_types.CXCursorKind.CXCursor_StructDecl:
         isSeenDecl = bindingsIndex.isSeenStruct;
         getSeenDecl = bindingsIndex.getSeenStruct;
         compoundType = CompoundType.struct;
+        compoundTypeMappings = config.structTypeMappings;
         break;
       case clang_types.CXCursorKind.CXCursor_UnionDecl:
         isSeenDecl = bindingsIndex.isSeenUnion;
         getSeenDecl = bindingsIndex.getSeenUnion;
         compoundType = CompoundType.union;
+        compoundTypeMappings = config.unionTypeMappings;
         break;
       default:
         throw Exception('Unhandled compound type cursorkind.');
@@ -165,7 +178,10 @@
 
     // Also add a struct binding, if its unseen.
     // TODO(23): Check if we should auto add compound declarations.
-    if (isSeenDecl(declUsr)) {
+    if (compoundTypeMappings.containsKey(declSpelling)) {
+      _logger.fine('  Type Mapped from type-map');
+      return Type.importedType(compoundTypeMappings[declSpelling]!);
+    } else if (isSeenDecl(declUsr)) {
       type = Type.compound(getSeenDecl(declUsr)!);
 
       // This will parse the dependencies if needed.
diff --git a/pkgs/ffigen/lib/src/header_parser/utils.dart b/pkgs/ffigen/lib/src/header_parser/utils.dart
index 471cc36..bac2eaf 100644
--- a/pkgs/ffigen/lib/src/header_parser/utils.dart
+++ b/pkgs/ffigen/lib/src/header_parser/utils.dart
@@ -18,7 +18,7 @@
 
 /// Check [resultCode] of [clang.clang_visitChildren_wrap].
 ///
-/// Throws exception if resultCode is not 0.
+/// Throws exception if resultCode is not [exceptional_visitor_return].
 void visitChildrenResultChecker(int resultCode) {
   if (resultCode != exceptional_visitor_return) {
     throw Exception(
@@ -104,9 +104,9 @@
   String sourceFileName() {
     final cxsource = clang.clang_getCursorLocation(this);
     final cxfilePtr = calloc<Pointer<Void>>();
-    final line = calloc<Uint32>();
-    final column = calloc<Uint32>();
-    final offset = calloc<Uint32>();
+    final line = calloc<UnsignedInt>();
+    final column = calloc<UnsignedInt>();
+    final offset = calloc<UnsignedInt>();
 
     // Puts the values in these pointers.
     clang.clang_getFileLocation(cxsource, cxfilePtr, line, column, offset);
diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart
index 5ae3e35..fbbd6b7 100644
--- a/pkgs/ffigen/lib/src/strings.dart
+++ b/pkgs/ffigen/lib/src/strings.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:io';
 
-import 'package:ffigen/src/code_generator/type.dart';
+import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart'
     as clang;
 
@@ -79,9 +79,6 @@
   16: 16,
 };
 
-const sizemap = 'size-map';
-const typedefmap = 'typedef-map';
-
 // Sizemap values.
 const SChar = 'char';
 const UChar = 'unsigned char';
@@ -110,6 +107,27 @@
   Enum: clang.CXTypeKind.CXType_Enum
 };
 
+// Library imports.
+const libraryImports = 'library-imports';
+
+final predefinedLibraryImports = {
+  ffiImport.name: ffiImport,
+  ffiPkgImport.name: ffiPkgImport
+};
+
+const typeMap = 'type-map';
+
+// Sub-fields for type-map.
+const typeMapTypedefs = 'typedefs';
+const typeMapStructs = 'structs';
+const typeMapUnions = 'unions';
+const typeMapNativeTypes = 'native-types';
+
+// Sub-sub-keys for fields under typeMap.
+const lib = 'lib';
+const cType = 'c-type';
+const dartType = 'dart-type';
+
 const supportedNativeType_mappings = <String, SupportedNativeType>{
   'Void': SupportedNativeType.Void,
   'Uint8': SupportedNativeType.Uint8,
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml
index 34b851e..e0e03b0 100644
--- a/pkgs/ffigen/pubspec.yaml
+++ b/pkgs/ffigen/pubspec.yaml
@@ -3,15 +3,15 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 4.1.3
+version: 5.0.0-dev.0
 homepage: https://github.com/dart-lang/ffigen
 description: Generator for FFI bindings, using LibClang to parse C header files.
 
 environment:
-  sdk: '>=2.14.0 <3.0.0'
+  sdk: '>=2.16.0-124.0.dev <3.0.0'
 
 dependencies:
-  ffi: ^1.0.0
+  ffi: ^1.2.0-dev.0
   yaml: ^3.0.0
   path: ^1.8.0
   quiver: ^3.0.0
diff --git a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
index 34905a4..9178cf0 100644
--- a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
+++ b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
@@ -422,12 +422,12 @@
     _matchLib(library, 'packed_structs');
   });
   test('Union Bindings', () {
-    final struct1 = Struc(name: 'Struct1', members: [
-      Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8))
-    ]);
-    final union1 = Union(name: 'Union1', members: [
-      Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8))
-    ]);
+    final struct1 = Struc(
+        name: 'Struct1',
+        members: [Member(name: 'a', type: Type.importedType(charType))]);
+    final union1 = Union(
+        name: 'Union1',
+        members: [Member(name: 'a', type: Type.importedType(charType))]);
     final library = Library(
       name: 'Bindings',
       bindings: [
@@ -435,25 +435,22 @@
         union1,
         Union(name: 'EmptyUnion'),
         Union(name: 'Primitives', members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8)),
-          Member(name: 'b', type: Type.nativeType(SupportedNativeType.Int32)),
-          Member(name: 'c', type: Type.nativeType(SupportedNativeType.Float)),
-          Member(name: 'd', type: Type.nativeType(SupportedNativeType.Double)),
+          Member(name: 'a', type: Type.importedType(charType)),
+          Member(name: 'b', type: Type.importedType(intType)),
+          Member(name: 'c', type: Type.importedType(floatType)),
+          Member(name: 'd', type: Type.importedType(doubleType)),
         ]),
         Union(name: 'PrimitivesWithPointers', members: [
-          Member(name: 'a', type: Type.nativeType(SupportedNativeType.Int8)),
-          Member(name: 'b', type: Type.nativeType(SupportedNativeType.Float)),
-          Member(
-              name: 'c',
-              type: Type.pointer(Type.nativeType(SupportedNativeType.Double))),
+          Member(name: 'a', type: Type.importedType(charType)),
+          Member(name: 'b', type: Type.importedType(floatType)),
+          Member(name: 'c', type: Type.pointer(Type.importedType(doubleType))),
           Member(name: 'd', type: Type.pointer(Type.union(union1))),
           Member(name: 'd', type: Type.pointer(Type.struct(struct1))),
         ]),
         Union(name: 'WithArray', members: [
           Member(
               name: 'a',
-              type: Type.constantArray(
-                  10, Type.nativeType(SupportedNativeType.Int8))),
+              type: Type.constantArray(10, Type.importedType(charType))),
           Member(name: 'b', type: Type.constantArray(10, Type.union(union1))),
           Member(name: 'b', type: Type.constantArray(10, Type.struct(struct1))),
           Member(
@@ -477,9 +474,7 @@
               type: Type.typealias(Typealias(
                   name: 'Struct2Typealias',
                   type: Type.struct(Struc(name: 'Struct2', members: [
-                    Member(
-                        name: 'a',
-                        type: Type.nativeType(SupportedNativeType.Double))
+                    Member(name: 'a', type: Type.importedType(doubleType))
                   ])))))
         ]),
         Func(
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
index 2e94121..6d81198 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_dartbool_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart
index c44dddd..88d3ce3 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_boolean_no_dartbool_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
index d01f2b1..4696f26 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_constant_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 const int test1 = 20;
 
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
index 0aa2dbb..910654f 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// test line 1
 /// test line 2
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
index ada968c..0912744 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
index 6ccce4e..df895e3 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_function_n_struct_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
index 0a531fa..766baa1 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_global_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
index b6e1378..7b5eca4 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_internal_conflict_resolution_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class init_dylib1 {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
index 4aea89a..b0e76bd 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_packed_structs_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class NoPacking extends ffi.Struct {
   @ffi.Uint8()
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
index cbae1f8..3bb980f 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
index f84642b..5c39d92 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_struct_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Just a test struct
 /// heres another line
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
index e605db2..e0c4884 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_typealias_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
index c7e7680..3483cb8 100644
--- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
+++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_unions_bindings.dart
@@ -2,24 +2,25 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Struct1 extends ffi.Struct {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 }
 
 class Union1 extends ffi.Union {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 }
 
 class EmptyUnion extends ffi.Opaque {}
 
 class Primitives extends ffi.Union {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int b;
 
   @ffi.Float()
@@ -30,7 +31,7 @@
 }
 
 class PrimitivesWithPointers extends ffi.Union {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 
   @ffi.Float()
@@ -45,7 +46,7 @@
 
 class WithArray extends ffi.Union {
   @ffi.Array.multi([10])
-  external ffi.Array<ffi.Int8> a;
+  external ffi.Array<pkg_ffi.Char> a;
 
   @ffi.Array.multi([10])
   external ffi.Array<Union1> b;
diff --git a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
index b45cdcd..e107a2c 100644
--- a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
+++ b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings1 {
   /// Holds the symbol lookup function.
diff --git a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
index 5dab4a2..7af357a 100644
--- a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
+++ b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
@@ -4,17 +4,18 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class A extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
 class B extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int B1;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int A;
 }
 
diff --git a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
index e38894d..eb2e61c 100644
--- a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
@@ -27,15 +27,15 @@
             name: 'implements',
             parameters: [
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'if',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'abstract',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'in',
               ),
             ],
@@ -62,15 +62,15 @@
             originalName: 'implements',
             parameters: [
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'if1',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'abstract1',
               ),
               Parameter(
-                type: Type.nativeType(SupportedNativeType.Int32),
+                type: Type.importedType(intType),
                 name: 'in1',
               ),
             ],
diff --git a/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart b/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart
new file mode 100644
index 0000000..4fcb680
--- /dev/null
+++ b/pkgs/ffigen/test/config_tests/unknown_keys_warn_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:ffigen/ffigen.dart';
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+import 'package:yaml/yaml.dart' as yaml;
+
+import '../test_utils.dart';
+
+late Library actual, expected;
+
+void main() {
+  var logString = '';
+  group('unknown_keys_warn_test', () {
+    setUpAll(() {
+      final logArr = <String>[];
+      logWarningsToArray(logArr, Level.WARNING);
+      Config.fromYaml(yaml.loadYaml('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Warn for unknown keys.'
+${strings.output}: 'unused'
+${strings.headers}:
+  ${strings.entryPoints}:
+    - 'test/header_parser_tests/packed_structs.h'
+'warn-1': 'warn'
+${strings.typeMap}:
+  'warn-2': 'warn'
+  'warn-3': 'warn'
+${strings.functions}:
+  'warn-4': 'skip'
+${strings.structs}:
+  'warn-5': 'skip'
+${strings.unions}:
+  'warn-6': 'skip'
+        ''') as yaml.YamlMap);
+      logString = logArr.join("\n");
+    });
+    test('Warn for unknown keys.', () {
+      expect(logString.contains('warn-1'), true);
+      expect(logString.contains('warn-2'), true);
+      expect(logString.contains('warn-3'), true);
+    });
+    test('Do not warn for unknown keys in declarations.', () {
+      expect(logString.contains('warn-4'), false);
+      expect(logString.contains('warn-5'), false);
+      expect(logString.contains('warn-6'), false);
+    });
+  });
+}
diff --git a/pkgs/ffigen/test/example_tests/cjson_example_test.dart b/pkgs/ffigen/test/example_tests/cjson_example_test.dart
index c95bcf2..65d5611 100644
--- a/pkgs/ffigen/test/example_tests/cjson_example_test.dart
+++ b/pkgs/ffigen/test/example_tests/cjson_example_test.dart
@@ -27,8 +27,12 @@
   ${strings.includeDirectives}:
     - '**cJSON.h'
 ${strings.comments}: false
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'size_t':
+      lib: 'pkg_ffi'
+      c-type: 'Size'
+      dart-type: 'int'
 ${strings.preamble}: |
   // Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
   //
diff --git a/pkgs/ffigen/test/example_tests/libclang_example_test.dart b/pkgs/ffigen/test/example_tests/libclang_example_test.dart
index 1ca9600..e22bd86 100644
--- a/pkgs/ffigen/test/example_tests/libclang_example_test.dart
+++ b/pkgs/ffigen/test/example_tests/libclang_example_test.dart
@@ -43,9 +43,28 @@
   ${strings.include}:
     - 'CXTypeKind'
     - 'CXGlobalOptFlags'
-${strings.typedefmap}:
-    'size_t': 'IntPtr'
-    'time_t': 'Int64'
+${strings.libraryImports}:
+  custom_import: 'custom_import.dart'
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'size_t':
+      lib: 'pkg_ffi'
+      c-type: 'Size'
+      dart-type: 'int'
+    'time_t':
+      lib: 'ffi'
+      c-type: 'Int64'
+      dart-type: 'int'
+  ${strings.typeMapNativeTypes}:
+    'unsigned long':
+      lib: 'custom_import'
+      c-type: 'UnsignedLong'
+      dart-type: 'int'
+  ${strings.typeMapStructs}:
+    'CXCursorSetImpl':
+      lib: 'custom_import'
+      c-type: 'CXCursorSetImpl'
+      dart-type: 'CXCursorSetImpl'
 ${strings.name}: 'LibClang'
 ${strings.description}: 'Holds bindings to LibClang.'
 ${strings.comments}:
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
index 6a95e52..b0f806a 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Comment Markup Test
 class NativeLibrary {
@@ -54,7 +55,7 @@
 class Com4 extends ffi.Struct {
   /// Muli-line test comment for struct field
   /// With multiple line and both // and ///.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 
   /// Single line field comment.
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
index b00eaf9..14b429c 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Dart_Handle Test
 class NativeLibrary {
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
index 01fe05c..c5c194b 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Forward Declaration Test
 class NativeLibrary {
@@ -36,10 +37,10 @@
 }
 
 class A extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int b;
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
index d42ec32..ae8eb0a 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Functions Test
 class NativeLibrary {
@@ -102,6 +103,22 @@
       void Function(ffi.Pointer<shortHand>,
           ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>();
 
+  int diffChars(
+    int a,
+    int b,
+  ) {
+    return _diffChars(
+      a,
+      b,
+    );
+  }
+
+  late final _diffCharsPtr = _lookup<
+      ffi.NativeFunction<
+          pkg_ffi.Char Function(
+              pkg_ffi.UnsignedChar, pkg_ffi.SignedChar)>>('diffChars');
+  late final _diffChars = _diffCharsPtr.asFunction<int Function(int, int)>();
+
   late final addresses = _SymbolAddresses(this);
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
index 802d838..baf9c6e 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Native Func Typedef Test.
 class NativeLibrary {
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
index b891dd9..2f07ba0 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Opaque Dependencies Test
 class NativeLibrary {
@@ -63,7 +64,7 @@
 class C extends ffi.Opaque {}
 
 class D extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
@@ -80,6 +81,6 @@
 class UC extends ffi.Opaque {}
 
 class UD extends ffi.Union {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
index d27adc4..2e4740f 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
@@ -2,48 +2,49 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class NormalStruct1 extends ffi.Struct {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 }
 
 /// Should not be packed.
 class StructWithAttr extends ffi.Struct {
-  external ffi.Pointer<ffi.Int32> a;
+  external ffi.Pointer<pkg_ffi.Int> a;
 
-  external ffi.Pointer<ffi.Int32> b;
+  external ffi.Pointer<pkg_ffi.Int> b;
 }
 
 /// Should be packed with 1.
 @ffi.Packed(1)
 class PackedAttr extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
 /// Should be packed with 8.
 @ffi.Packed(8)
 class PackedAttrAlign8 extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
 /// Should be packed with 2.
 @ffi.Packed(2)
 class Pack2WithPragma extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
 /// Should be packed with 4.
 @ffi.Packed(4)
 class Pack4WithPragma extends ffi.Struct {
-  @ffi.Int64()
+  @pkg_ffi.LongLong()
   external int a;
 }
 
 class NormalStruct2 extends ffi.Struct {
-  @ffi.Int8()
+  @pkg_ffi.Char()
   external int a;
 }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
index ec8eb3f..35b0dac 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 class Bindings {
   /// Holds the symbol lookup function.
@@ -21,7 +22,7 @@
 
   NamedFunctionProto func1(
     NamedFunctionProto named,
-    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>> unnamed,
+    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(pkg_ffi.Int)>> unnamed,
   ) {
     return _func1(
       named,
@@ -30,14 +31,15 @@
   }
 
   late final _func1Ptr = _lookup<
-      ffi.NativeFunction<
-          NamedFunctionProto Function(
-              NamedFunctionProto,
-              ffi.Pointer<
-                  ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>)>>('func1');
+          ffi.NativeFunction<
+              NamedFunctionProto Function(
+                  NamedFunctionProto,
+                  ffi.Pointer<
+                      ffi.NativeFunction<ffi.Void Function(pkg_ffi.Int)>>)>>(
+      'func1');
   late final _func1 = _func1Ptr.asFunction<
       NamedFunctionProto Function(NamedFunctionProto,
-          ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>)>();
+          ffi.Pointer<ffi.NativeFunction<ffi.Void Function(pkg_ffi.Int)>>)>();
 
   void func2(
     ffi.Pointer<NTyperef1> arg0,
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
index 1f62444..d17d65a 100644
--- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
+++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
@@ -2,6 +2,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Unions Test
 class NativeLibrary {
@@ -49,7 +50,7 @@
 }
 
 class Union1 extends ffi.Union {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 }
 
diff --git a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
index 3b34013..d56cd4e 100644
--- a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
@@ -71,7 +71,7 @@
   final struc1 = Struc(name: 'Struct1', members: [
     Member(
       name: 'a',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: Type.importedType(intType),
     ),
   ]);
   final struc2 = Struc(name: 'Struct2', members: [
@@ -108,9 +108,7 @@
       Func(
         name: 'func3',
         parameters: [
-          Parameter(
-              name: 'a',
-              type: Type.pointer(Type.nativeType(SupportedNativeType.Int32))),
+          Parameter(name: 'a', type: Type.pointer(Type.importedType(intType))),
         ],
         returnType: Type.nativeType(
           SupportedNativeType.Void,
@@ -122,9 +120,7 @@
         Member(
             name: 'a',
             type: Type.constantArray(
-                2,
-                Type.constantArray(
-                    10, Type.nativeType(SupportedNativeType.Int32))))
+                2, Type.constantArray(10, Type.importedType(intType))))
       ]),
     ],
   );
diff --git a/pkgs/ffigen/test/header_parser_tests/functions.h b/pkgs/ffigen/test/header_parser_tests/functions.h
index 56ec2be..28b8546 100644
--- a/pkgs/ffigen/test/header_parser_tests/functions.h
+++ b/pkgs/ffigen/test/header_parser_tests/functions.h
@@ -19,3 +19,5 @@
 
 // Should be skipped as inline functions are not supported.
 static inline void inlineFunc();
+
+char diffChars(unsigned char a, signed char b);
diff --git a/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart b/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
index d09d972..10dc390 100644
--- a/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/nested_parsing_test.dart
@@ -64,21 +64,21 @@
   final struc2 = Struc(name: 'Struct2', members: [
     Member(
       name: 'e',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: Type.importedType(intType),
     ),
     Member(
       name: 'f',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: Type.importedType(intType),
     ),
   ]);
   final unnamedInternalStruc = Struc(name: 'UnnamedStruct1', members: [
     Member(
       name: 'a',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: Type.importedType(intType),
     ),
     Member(
       name: 'b',
-      type: Type.nativeType(SupportedNativeType.Int32),
+      type: Type.importedType(intType),
     ),
   ]);
   return Library(
@@ -89,18 +89,18 @@
       Struc(name: 'Struct1', members: [
         Member(
           name: 'a',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: Type.importedType(intType),
         ),
         Member(
           name: 'b',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: Type.importedType(intType),
         ),
         Member(name: 'struct2', type: Type.pointer(Type.struct(struc2))),
       ]),
       Struc(name: 'Struct3', members: [
         Member(
           name: 'a',
-          type: Type.nativeType(SupportedNativeType.Int32),
+          type: Type.importedType(intType),
         ),
         Member(
           name: 'b',
diff --git a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
index 6759603..abac0e0 100644
--- a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
+++ b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
@@ -32,9 +32,12 @@
   ${strings.exclude}:
     - ExcludedStruct
     - _ExcludedStruct
-${strings.typedefmap}:
-  'SpecifiedTypeAsIntPtr': 'IntPtr'
-
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'SpecifiedTypeAsIntPtr':
+        lib: 'ffi'
+        c-type: 'IntPtr'
+        dart-type: 'int'
 ${strings.preamble}: |
   // ignore_for_file: unused_element, unused_field
         ''') as yaml.YamlMap),
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
index f16ca6e..794ef5c 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Bindings to Cjson.
 class CJson {
@@ -20,15 +21,15 @@
           lookup)
       : _lookup = lookup;
 
-  ffi.Pointer<ffi.Int8> cJSON_Version() {
+  ffi.Pointer<pkg_ffi.Char> cJSON_Version() {
     return _cJSON_Version();
   }
 
   late final _cJSON_VersionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'cJSON_Version');
   late final _cJSON_Version =
-      _cJSON_VersionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_VersionPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
@@ -45,7 +46,7 @@
       _cJSON_InitHooksPtr.asFunction<void Function(ffi.Pointer<cJSON_Hooks>)>();
 
   ffi.Pointer<cJSON> cJSON_Parse(
-    ffi.Pointer<ffi.Int8> value,
+    ffi.Pointer<pkg_ffi.Char> value,
   ) {
     return _cJSON_Parse(
       value,
@@ -54,13 +55,14 @@
 
   late final _cJSON_ParsePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>>('cJSON_Parse');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_Parse');
   late final _cJSON_Parse = _cJSON_ParsePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
-    ffi.Pointer<ffi.Int8> value,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
+    ffi.Pointer<pkg_ffi.Char> value,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> return_parse_end,
     int require_null_terminated,
   ) {
     return _cJSON_ParseWithOpts(
@@ -73,14 +75,14 @@
   late final _cJSON_ParseWithOptsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               cJSON_bool)>>('cJSON_ParseWithOpts');
   late final _cJSON_ParseWithOpts = _cJSON_ParseWithOptsPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>, int)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_Print(
+  ffi.Pointer<pkg_ffi.Char> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_Print(
@@ -90,11 +92,12 @@
 
   late final _cJSON_PrintPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>>('cJSON_Print');
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<cJSON>)>>('cJSON_Print');
   late final _cJSON_Print = _cJSON_PrintPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
+  ffi.Pointer<pkg_ffi.Char> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_PrintUnformatted(
@@ -104,12 +107,12 @@
 
   late final _cJSON_PrintUnformattedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_PrintUnformatted');
   late final _cJSON_PrintUnformatted = _cJSON_PrintUnformattedPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
+  ffi.Pointer<pkg_ffi.Char> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
@@ -123,14 +126,14 @@
 
   late final _cJSON_PrintBufferedPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               cJSON_bool)>>('cJSON_PrintBuffered');
   late final _cJSON_PrintBuffered = _cJSON_PrintBufferedPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>, int, int)>();
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>, int, int)>();
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
-    ffi.Pointer<ffi.Int8> buffer,
+    ffi.Pointer<pkg_ffi.Char> buffer,
     int length,
     int format,
   ) {
@@ -144,10 +147,10 @@
 
   late final _cJSON_PrintPreallocatedPtr = _lookup<
       ffi.NativeFunction<
-          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, cJSON_bool)>>('cJSON_PrintPreallocated');
+          cJSON_bool Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int, cJSON_bool)>>('cJSON_PrintPreallocated');
   late final _cJSON_PrintPreallocated = _cJSON_PrintPreallocatedPtr.asFunction<
-      int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int, int)>();
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, int, int)>();
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
@@ -172,7 +175,7 @@
   }
 
   late final _cJSON_GetArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<cJSON>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<cJSON>)>>(
           'cJSON_GetArraySize');
   late final _cJSON_GetArraySize =
       _cJSON_GetArraySizePtr.asFunction<int Function(ffi.Pointer<cJSON>)>();
@@ -190,13 +193,13 @@
   late final _cJSON_GetArrayItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_GetArrayItem');
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_GetArrayItem');
   late final _cJSON_GetArrayItem = _cJSON_GetArrayItemPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_GetObjectItem(
       object,
@@ -207,13 +210,14 @@
   late final _cJSON_GetObjectItemPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItem');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_GetObjectItem');
   late final _cJSON_GetObjectItem = _cJSON_GetObjectItemPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_GetObjectItemCaseSensitive(
       object,
@@ -224,15 +228,15 @@
   late final _cJSON_GetObjectItemCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_GetObjectItemCaseSensitive');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_GetObjectItemCaseSensitive');
   late final _cJSON_GetObjectItemCaseSensitive =
       _cJSON_GetObjectItemCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_HasObjectItem(
       object,
@@ -243,21 +247,21 @@
   late final _cJSON_HasObjectItemPtr = _lookup<
       ffi.NativeFunction<
           cJSON_bool Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_HasObjectItem');
-  late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr
-      .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_HasObjectItem');
+  late final _cJSON_HasObjectItem = _cJSON_HasObjectItemPtr.asFunction<
+      int Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
+  ffi.Pointer<pkg_ffi.Char> cJSON_GetErrorPtr() {
     return _cJSON_GetErrorPtr();
   }
 
   late final _cJSON_GetErrorPtrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'cJSON_GetErrorPtr');
   late final _cJSON_GetErrorPtr =
-      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _cJSON_GetErrorPtrPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
+  ffi.Pointer<pkg_ffi.Char> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_GetStringValue(
@@ -267,10 +271,10 @@
 
   late final _cJSON_GetStringValuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<cJSON>)>>('cJSON_GetStringValue');
   late final _cJSON_GetStringValue = _cJSON_GetStringValuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<cJSON>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<cJSON>)>();
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
@@ -471,7 +475,7 @@
       _cJSON_CreateNumberPtr.asFunction<ffi.Pointer<cJSON> Function(double)>();
 
   ffi.Pointer<cJSON> cJSON_CreateString(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_CreateString(
       string,
@@ -481,12 +485,12 @@
   late final _cJSON_CreateStringPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateString');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateString');
   late final _cJSON_CreateString = _cJSON_CreateStringPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<pkg_ffi.Char> raw,
   ) {
     return _cJSON_CreateRaw(
       raw,
@@ -496,9 +500,9 @@
   late final _cJSON_CreateRawPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateRaw');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateRaw');
   late final _cJSON_CreateRaw = _cJSON_CreateRawPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
     return _cJSON_CreateArray();
@@ -521,7 +525,7 @@
       _cJSON_CreateObjectPtr.asFunction<ffi.Pointer<cJSON> Function()>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_CreateStringReference(
       string,
@@ -531,9 +535,9 @@
   late final _cJSON_CreateStringReferencePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int8>)>>('cJSON_CreateStringReference');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_CreateStringReference');
   late final _cJSON_CreateStringReference = _cJSON_CreateStringReferencePtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
@@ -564,7 +568,7 @@
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
-    ffi.Pointer<ffi.Int32> numbers,
+    ffi.Pointer<pkg_ffi.Int> numbers,
     int count,
   ) {
     return _cJSON_CreateIntArray(
@@ -576,9 +580,9 @@
   late final _cJSON_CreateIntArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('cJSON_CreateIntArray');
+              ffi.Pointer<pkg_ffi.Int>, pkg_ffi.Int)>>('cJSON_CreateIntArray');
   late final _cJSON_CreateIntArray = _cJSON_CreateIntArrayPtr
-      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Int32>, int)>();
+      .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<pkg_ffi.Int>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
@@ -593,7 +597,7 @@
   late final _cJSON_CreateFloatArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Float>, ffi.Int32)>>('cJSON_CreateFloatArray');
+              ffi.Pointer<ffi.Float>, pkg_ffi.Int)>>('cJSON_CreateFloatArray');
   late final _cJSON_CreateFloatArray = _cJSON_CreateFloatArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Float>, int)>();
 
@@ -609,13 +613,13 @@
 
   late final _cJSON_CreateDoubleArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(
-              ffi.Pointer<ffi.Double>, ffi.Int32)>>('cJSON_CreateDoubleArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>,
+              pkg_ffi.Int)>>('cJSON_CreateDoubleArray');
   late final _cJSON_CreateDoubleArray = _cJSON_CreateDoubleArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Double>, int)>();
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> strings,
     int count,
   ) {
     return _cJSON_CreateStringArray(
@@ -626,10 +630,11 @@
 
   late final _cJSON_CreateStringArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32)>>('cJSON_CreateStringArray');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int)>>('cJSON_CreateStringArray');
   late final _cJSON_CreateStringArray = _cJSON_CreateStringArrayPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>, int)>();
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
@@ -650,7 +655,7 @@
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObject(
@@ -662,15 +667,15 @@
 
   late final _cJSON_AddItemToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObject');
   late final _cJSON_AddItemToObject = _cJSON_AddItemToObjectPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemToObjectCS(
@@ -682,11 +687,11 @@
 
   late final _cJSON_AddItemToObjectCSPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemToObjectCS');
   late final _cJSON_AddItemToObjectCS = _cJSON_AddItemToObjectCSPtr.asFunction<
       void Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<cJSON>)>();
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
@@ -707,7 +712,7 @@
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> item,
   ) {
     return _cJSON_AddItemReferenceToObject(
@@ -719,12 +724,12 @@
 
   late final _cJSON_AddItemReferenceToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_AddItemReferenceToObject');
   late final _cJSON_AddItemReferenceToObject =
       _cJSON_AddItemReferenceToObjectPtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
@@ -758,7 +763,7 @@
   late final _cJSON_DetachItemFromArrayPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Int32)>>('cJSON_DetachItemFromArray');
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_DetachItemFromArray');
   late final _cJSON_DetachItemFromArray = _cJSON_DetachItemFromArrayPtr
       .asFunction<ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, int)>();
 
@@ -773,14 +778,15 @@
   }
 
   late final _cJSON_DeleteItemFromArrayPtr = _lookup<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32)>>(
-      'cJSON_DeleteItemFromArray');
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<cJSON>, pkg_ffi.Int)>>('cJSON_DeleteItemFromArray');
   late final _cJSON_DeleteItemFromArray = _cJSON_DeleteItemFromArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObject(
       object,
@@ -791,15 +797,15 @@
   late final _cJSON_DetachItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DetachItemFromObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_DetachItemFromObject');
   late final _cJSON_DetachItemFromObject =
       _cJSON_DetachItemFromObjectPtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DetachItemFromObjectCaseSensitive(
       object,
@@ -810,16 +816,16 @@
   late final _cJSON_DetachItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
               ffi.Pointer<cJSON> Function(
-                  ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+                  ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>>(
       'cJSON_DetachItemFromObjectCaseSensitive');
   late final _cJSON_DetachItemFromObjectCaseSensitive =
       _cJSON_DetachItemFromObjectCaseSensitivePtr.asFunction<
           ffi.Pointer<cJSON> Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObject(
       object,
@@ -830,13 +836,14 @@
   late final _cJSON_DeleteItemFromObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_DeleteItemFromObject');
-  late final _cJSON_DeleteItemFromObject = _cJSON_DeleteItemFromObjectPtr
-      .asFunction<void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_DeleteItemFromObject');
+  late final _cJSON_DeleteItemFromObject =
+      _cJSON_DeleteItemFromObjectPtr.asFunction<
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_DeleteItemFromObjectCaseSensitive(
       object,
@@ -846,11 +853,12 @@
 
   late final _cJSON_DeleteItemFromObjectCaseSensitivePtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(
+                  ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>>(
       'cJSON_DeleteItemFromObjectCaseSensitive');
   late final _cJSON_DeleteItemFromObjectCaseSensitive =
       _cJSON_DeleteItemFromObjectCaseSensitivePtr.asFunction<
-          void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void cJSON_InsertItemInArray(
     ffi.Pointer<cJSON> array,
@@ -866,7 +874,7 @@
 
   late final _cJSON_InsertItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_InsertItemInArray');
   late final _cJSON_InsertItemInArray = _cJSON_InsertItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
@@ -906,14 +914,14 @@
 
   late final _cJSON_ReplaceItemInArrayPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Int32,
+          ffi.Void Function(ffi.Pointer<cJSON>, pkg_ffi.Int,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInArray');
   late final _cJSON_ReplaceItemInArray = _cJSON_ReplaceItemInArrayPtr
       .asFunction<void Function(ffi.Pointer<cJSON>, int, ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObject(
@@ -925,16 +933,16 @@
 
   late final _cJSON_ReplaceItemInObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObject');
   late final _cJSON_ReplaceItemInObject =
       _cJSON_ReplaceItemInObjectPtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> string,
     ffi.Pointer<cJSON> newitem,
   ) {
     return _cJSON_ReplaceItemInObjectCaseSensitive(
@@ -946,12 +954,12 @@
 
   late final _cJSON_ReplaceItemInObjectCaseSensitivePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<cJSON>)>>('cJSON_ReplaceItemInObjectCaseSensitive');
   late final _cJSON_ReplaceItemInObjectCaseSensitive =
       _cJSON_ReplaceItemInObjectCaseSensitivePtr.asFunction<
-          void Function(
-              ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<cJSON>)>();
+          void Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<cJSON>)>();
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
@@ -990,7 +998,7 @@
       .asFunction<int Function(ffi.Pointer<cJSON>, ffi.Pointer<cJSON>, int)>();
 
   void cJSON_Minify(
-    ffi.Pointer<ffi.Int8> json,
+    ffi.Pointer<pkg_ffi.Char> json,
   ) {
     return _cJSON_Minify(
       json,
@@ -998,14 +1006,14 @@
   }
 
   late final _cJSON_MinifyPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<pkg_ffi.Char>)>>(
           'cJSON_Minify');
   late final _cJSON_Minify =
-      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      _cJSON_MinifyPtr.asFunction<void Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddNullToObject(
       object,
@@ -1016,13 +1024,14 @@
   late final _cJSON_AddNullToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddNullToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddNullToObject');
   late final _cJSON_AddNullToObject = _cJSON_AddNullToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddTrueToObject(
       object,
@@ -1033,13 +1042,14 @@
   late final _cJSON_AddTrueToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddTrueToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddTrueToObject');
   late final _cJSON_AddTrueToObject = _cJSON_AddTrueToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddFalseToObject(
       object,
@@ -1050,13 +1060,14 @@
   late final _cJSON_AddFalseToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddFalseToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddFalseToObject');
   late final _cJSON_AddFalseToObject = _cJSON_AddFalseToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     int boolean,
   ) {
     return _cJSON_AddBoolToObject(
@@ -1068,15 +1079,15 @@
 
   late final _cJSON_AddBoolToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              cJSON_bool)>>('cJSON_AddBoolToObject');
+          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>, cJSON_bool)>>('cJSON_AddBoolToObject');
   late final _cJSON_AddBoolToObject = _cJSON_AddBoolToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     double number,
   ) {
     return _cJSON_AddNumberToObject(
@@ -1088,16 +1099,18 @@
 
   late final _cJSON_AddNumberToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Double)>>('cJSON_AddNumberToObject');
   late final _cJSON_AddNumberToObject = _cJSON_AddNumberToObjectPtr.asFunction<
       ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, double)>();
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>, double)>();
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<pkg_ffi.Char> name,
+    ffi.Pointer<pkg_ffi.Char> string,
   ) {
     return _cJSON_AddStringToObject(
       object,
@@ -1108,16 +1121,18 @@
 
   late final _cJSON_AddStringToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddStringToObject');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddStringToObject');
   late final _cJSON_AddStringToObject = _cJSON_AddStringToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
-    ffi.Pointer<ffi.Int8> raw,
+    ffi.Pointer<pkg_ffi.Char> name,
+    ffi.Pointer<pkg_ffi.Char> raw,
   ) {
     return _cJSON_AddRawToObject(
       object,
@@ -1128,15 +1143,17 @@
 
   late final _cJSON_AddRawToObjectPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddRawToObject');
+          ffi.Pointer<cJSON> Function(
+              ffi.Pointer<cJSON>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddRawToObject');
   late final _cJSON_AddRawToObject = _cJSON_AddRawToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(
-          ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddObjectToObject(
       object,
@@ -1147,13 +1164,14 @@
   late final _cJSON_AddObjectToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddObjectToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddObjectToObject');
   late final _cJSON_AddObjectToObject = _cJSON_AddObjectToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _cJSON_AddArrayToObject(
       object,
@@ -1164,9 +1182,10 @@
   late final _cJSON_AddArrayToObjectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>,
-              ffi.Pointer<ffi.Int8>)>>('cJSON_AddArrayToObject');
+              ffi.Pointer<pkg_ffi.Char>)>>('cJSON_AddArrayToObject');
   late final _cJSON_AddArrayToObject = _cJSON_AddArrayToObjectPtr.asFunction<
-      ffi.Pointer<cJSON> Function(ffi.Pointer<cJSON>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<cJSON> Function(
+          ffi.Pointer<cJSON>, ffi.Pointer<pkg_ffi.Char>)>();
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
@@ -1194,7 +1213,7 @@
   }
 
   late final _cJSON_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Size)>>(
           'cJSON_malloc');
   late final _cJSON_malloc =
       _cJSON_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1221,30 +1240,31 @@
 
   external ffi.Pointer<cJSON> child;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int type;
 
-  external ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<pkg_ffi.Char> valuestring;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int valueint;
 
   @ffi.Double()
   external double valuedouble;
 
-  external ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<pkg_ffi.Char> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.IntPtr)>> malloc_fn;
+          ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Size)>>
+      malloc_fn;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
       free_fn;
 }
 
-typedef cJSON_bool = ffi.Int32;
+typedef cJSON_bool = pkg_ffi.Int;
 
 const int CJSON_VERSION_MAJOR = 1;
 
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
index 78cc9c6..2255e6f 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Bindings to LibClang.
 class LibClang {
@@ -21,7 +22,7 @@
       : _lookup = lookup;
 
   /// Retrieve the character data associated with the given string.
-  ffi.Pointer<ffi.Int8> clang_getCString(
+  ffi.Pointer<pkg_ffi.Char> clang_getCString(
     CXString string,
   ) {
     return _clang_getCString(
@@ -30,10 +31,10 @@
   }
 
   late final _clang_getCStringPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXString)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(CXString)>>(
           'clang_getCString');
   late final _clang_getCString = _clang_getCStringPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(CXString)>();
 
   /// Free the given string.
   void clang_disposeString(
@@ -72,7 +73,7 @@
   }
 
   late final _clang_getBuildSessionTimestampPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedLongLong Function()>>(
           'clang_getBuildSessionTimestamp');
   late final _clang_getBuildSessionTimestamp =
       _clang_getBuildSessionTimestampPtr.asFunction<int Function()>();
@@ -87,9 +88,10 @@
     );
   }
 
-  late final _clang_VirtualFileOverlay_createPtr =
-      _lookup<ffi.NativeFunction<CXVirtualFileOverlay Function(ffi.Uint32)>>(
-          'clang_VirtualFileOverlay_create');
+  late final _clang_VirtualFileOverlay_createPtr = _lookup<
+      ffi.NativeFunction<
+          CXVirtualFileOverlay Function(
+              pkg_ffi.UnsignedInt)>>('clang_VirtualFileOverlay_create');
   late final _clang_VirtualFileOverlay_create =
       _clang_VirtualFileOverlay_createPtr
           .asFunction<CXVirtualFileOverlay Function(int)>();
@@ -98,8 +100,8 @@
   /// path must be canonicalized (not contain "."/"..").
   int clang_VirtualFileOverlay_addFileMapping(
     CXVirtualFileOverlay arg0,
-    ffi.Pointer<ffi.Int8> virtualPath,
-    ffi.Pointer<ffi.Int8> realPath,
+    ffi.Pointer<pkg_ffi.Char> virtualPath,
+    ffi.Pointer<pkg_ffi.Char> realPath,
   ) {
     return _clang_VirtualFileOverlay_addFileMapping(
       arg0,
@@ -110,13 +112,13 @@
 
   late final _clang_VirtualFileOverlay_addFileMappingPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Int8>)>>(
+              ffi.Int32 Function(CXVirtualFileOverlay,
+                  ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>>(
       'clang_VirtualFileOverlay_addFileMapping');
   late final _clang_VirtualFileOverlay_addFileMapping =
       _clang_VirtualFileOverlay_addFileMappingPtr.asFunction<
-          int Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>();
+          int Function(CXVirtualFileOverlay, ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Set the case sensitivity for the CXVirtualFileOverlay object. The
   /// CXVirtualFileOverlay object is case-sensitive by default, this option can
@@ -134,7 +136,7 @@
   late final _clang_VirtualFileOverlay_setCaseSensitivityPtr = _lookup<
       ffi.NativeFunction<
           ffi.Int32 Function(CXVirtualFileOverlay,
-              ffi.Int32)>>('clang_VirtualFileOverlay_setCaseSensitivity');
+              pkg_ffi.Int)>>('clang_VirtualFileOverlay_setCaseSensitivity');
   late final _clang_VirtualFileOverlay_setCaseSensitivity =
       _clang_VirtualFileOverlay_setCaseSensitivityPtr
           .asFunction<int Function(CXVirtualFileOverlay, int)>();
@@ -143,8 +145,8 @@
   int clang_VirtualFileOverlay_writeToBuffer(
     CXVirtualFileOverlay arg0,
     int options,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
-    ffi.Pointer<ffi.Uint32> out_buffer_size,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> out_buffer_ptr,
+    ffi.Pointer<pkg_ffi.UnsignedInt> out_buffer_size,
   ) {
     return _clang_VirtualFileOverlay_writeToBuffer(
       arg0,
@@ -158,14 +160,17 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXVirtualFileOverlay,
-                  ffi.Uint32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  pkg_ffi.UnsignedInt,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
       'clang_VirtualFileOverlay_writeToBuffer');
   late final _clang_VirtualFileOverlay_writeToBuffer =
       _clang_VirtualFileOverlay_writeToBufferPtr.asFunction<
-          int Function(CXVirtualFileOverlay, int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(
+              CXVirtualFileOverlay,
+              int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// free memory allocated by libclang, such as the buffer returned by
   /// CXVirtualFileOverlay() or clang_ModuleMapDescriptor_writeToBuffer().
@@ -209,9 +214,10 @@
     );
   }
 
-  late final _clang_ModuleMapDescriptor_createPtr =
-      _lookup<ffi.NativeFunction<CXModuleMapDescriptor Function(ffi.Uint32)>>(
-          'clang_ModuleMapDescriptor_create');
+  late final _clang_ModuleMapDescriptor_createPtr = _lookup<
+      ffi.NativeFunction<
+          CXModuleMapDescriptor Function(
+              pkg_ffi.UnsignedInt)>>('clang_ModuleMapDescriptor_create');
   late final _clang_ModuleMapDescriptor_create =
       _clang_ModuleMapDescriptor_createPtr
           .asFunction<CXModuleMapDescriptor Function(int)>();
@@ -219,7 +225,7 @@
   /// Sets the framework module name that the module.map describes.
   int clang_ModuleMapDescriptor_setFrameworkModuleName(
     CXModuleMapDescriptor arg0,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _clang_ModuleMapDescriptor_setFrameworkModuleName(
       arg0,
@@ -230,16 +236,16 @@
   late final _clang_ModuleMapDescriptor_setFrameworkModuleNamePtr = _lookup<
           ffi.NativeFunction<
               ffi.Int32 Function(
-                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
+                  CXModuleMapDescriptor, ffi.Pointer<pkg_ffi.Char>)>>(
       'clang_ModuleMapDescriptor_setFrameworkModuleName');
   late final _clang_ModuleMapDescriptor_setFrameworkModuleName =
       _clang_ModuleMapDescriptor_setFrameworkModuleNamePtr.asFunction<
-          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();
+          int Function(CXModuleMapDescriptor, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Sets the umbrealla header name that the module.map describes.
   int clang_ModuleMapDescriptor_setUmbrellaHeader(
     CXModuleMapDescriptor arg0,
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
   ) {
     return _clang_ModuleMapDescriptor_setUmbrellaHeader(
       arg0,
@@ -250,18 +256,18 @@
   late final _clang_ModuleMapDescriptor_setUmbrellaHeaderPtr = _lookup<
           ffi.NativeFunction<
               ffi.Int32 Function(
-                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
+                  CXModuleMapDescriptor, ffi.Pointer<pkg_ffi.Char>)>>(
       'clang_ModuleMapDescriptor_setUmbrellaHeader');
   late final _clang_ModuleMapDescriptor_setUmbrellaHeader =
       _clang_ModuleMapDescriptor_setUmbrellaHeaderPtr.asFunction<
-          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();
+          int Function(CXModuleMapDescriptor, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Write out the CXModuleMapDescriptor object to a char buffer.
   int clang_ModuleMapDescriptor_writeToBuffer(
     CXModuleMapDescriptor arg0,
     int options,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
-    ffi.Pointer<ffi.Uint32> out_buffer_size,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> out_buffer_ptr,
+    ffi.Pointer<pkg_ffi.UnsignedInt> out_buffer_size,
   ) {
     return _clang_ModuleMapDescriptor_writeToBuffer(
       arg0,
@@ -275,14 +281,17 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXModuleMapDescriptor,
-                  ffi.Uint32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  pkg_ffi.UnsignedInt,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
       'clang_ModuleMapDescriptor_writeToBuffer');
   late final _clang_ModuleMapDescriptor_writeToBuffer =
       _clang_ModuleMapDescriptor_writeToBufferPtr.asFunction<
-          int Function(CXModuleMapDescriptor, int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(
+              CXModuleMapDescriptor,
+              int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Dispose a CXModuleMapDescriptor object.
   void clang_ModuleMapDescriptor_dispose(
@@ -312,7 +321,7 @@
   }
 
   late final _clang_createIndexPtr =
-      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int32, ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<CXIndex Function(pkg_ffi.Int, pkg_ffi.Int)>>(
           'clang_createIndex');
   late final _clang_createIndex =
       _clang_createIndexPtr.asFunction<CXIndex Function(int, int)>();
@@ -343,9 +352,9 @@
     );
   }
 
-  late final _clang_CXIndex_setGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndex, ffi.Uint32)>>(
-          'clang_CXIndex_setGlobalOptions');
+  late final _clang_CXIndex_setGlobalOptionsPtr = _lookup<
+          ffi.NativeFunction<ffi.Void Function(CXIndex, pkg_ffi.UnsignedInt)>>(
+      'clang_CXIndex_setGlobalOptions');
   late final _clang_CXIndex_setGlobalOptions =
       _clang_CXIndex_setGlobalOptionsPtr
           .asFunction<void Function(CXIndex, int)>();
@@ -360,7 +369,7 @@
   }
 
   late final _clang_CXIndex_getGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXIndex)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXIndex)>>(
           'clang_CXIndex_getGlobalOptions');
   late final _clang_CXIndex_getGlobalOptions =
       _clang_CXIndex_getGlobalOptionsPtr.asFunction<int Function(CXIndex)>();
@@ -368,7 +377,7 @@
   /// Sets the invocation emission path option in a CXIndex.
   void clang_CXIndex_setInvocationEmissionPathOption(
     CXIndex arg0,
-    ffi.Pointer<ffi.Int8> Path,
+    ffi.Pointer<pkg_ffi.Char> Path,
   ) {
     return _clang_CXIndex_setInvocationEmissionPathOption(
       arg0,
@@ -378,11 +387,11 @@
 
   late final _clang_CXIndex_setInvocationEmissionPathOptionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Void Function(CXIndex, ffi.Pointer<ffi.Int8>)>>(
+              ffi.Void Function(CXIndex, ffi.Pointer<pkg_ffi.Char>)>>(
       'clang_CXIndex_setInvocationEmissionPathOption');
   late final _clang_CXIndex_setInvocationEmissionPathOption =
       _clang_CXIndex_setInvocationEmissionPathOptionPtr
-          .asFunction<void Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+          .asFunction<void Function(CXIndex, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Retrieve the complete file and path name of the given file.
   CXString clang_getFileName(
@@ -427,7 +436,7 @@
 
   late final _clang_getFileUniqueIDPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXFile, ffi.Pointer<CXFileUniqueID>)>>('clang_getFileUniqueID');
   late final _clang_getFileUniqueID = _clang_getFileUniqueIDPtr
       .asFunction<int Function(CXFile, ffi.Pointer<CXFileUniqueID>)>();
@@ -446,8 +455,9 @@
   }
 
   late final _clang_isFileMultipleIncludeGuardedPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXFile)>>(
-      'clang_isFileMultipleIncludeGuarded');
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(CXTranslationUnit,
+              CXFile)>>('clang_isFileMultipleIncludeGuarded');
   late final _clang_isFileMultipleIncludeGuarded =
       _clang_isFileMultipleIncludeGuardedPtr
           .asFunction<int Function(CXTranslationUnit, CXFile)>();
@@ -455,7 +465,7 @@
   /// Retrieve a file handle within the given translation unit.
   CXFile clang_getFile(
     CXTranslationUnit tu,
-    ffi.Pointer<ffi.Int8> file_name,
+    ffi.Pointer<pkg_ffi.Char> file_name,
   ) {
     return _clang_getFile(
       tu,
@@ -466,15 +476,15 @@
   late final _clang_getFilePtr = _lookup<
       ffi.NativeFunction<
           CXFile Function(
-              CXTranslationUnit, ffi.Pointer<ffi.Int8>)>>('clang_getFile');
-  late final _clang_getFile = _clang_getFilePtr
-      .asFunction<CXFile Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>)>();
+              CXTranslationUnit, ffi.Pointer<pkg_ffi.Char>)>>('clang_getFile');
+  late final _clang_getFile = _clang_getFilePtr.asFunction<
+      CXFile Function(CXTranslationUnit, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Retrieve the buffer associated with the given file.
-  ffi.Pointer<ffi.Int8> clang_getFileContents(
+  ffi.Pointer<pkg_ffi.Char> clang_getFileContents(
     CXTranslationUnit tu,
     CXFile file,
-    ffi.Pointer<ffi.IntPtr> size,
+    ffi.Pointer<pkg_ffi.Size> size,
   ) {
     return _clang_getFileContents(
       tu,
@@ -485,11 +495,11 @@
 
   late final _clang_getFileContentsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(CXTranslationUnit, CXFile,
-              ffi.Pointer<ffi.IntPtr>)>>('clang_getFileContents');
+          ffi.Pointer<pkg_ffi.Char> Function(CXTranslationUnit, CXFile,
+              ffi.Pointer<pkg_ffi.Size>)>>('clang_getFileContents');
   late final _clang_getFileContents = _clang_getFileContentsPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          CXTranslationUnit, CXFile, ffi.Pointer<ffi.IntPtr>)>();
+      ffi.Pointer<pkg_ffi.Char> Function(
+          CXTranslationUnit, CXFile, ffi.Pointer<pkg_ffi.Size>)>();
 
   /// Returns non-zero if the file1 and file2 point to the same file, or they
   /// are both NULL.
@@ -504,7 +514,7 @@
   }
 
   late final _clang_File_isEqualPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXFile, CXFile)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXFile, CXFile)>>(
           'clang_File_isEqual');
   late final _clang_File_isEqual =
       _clang_File_isEqualPtr.asFunction<int Function(CXFile, CXFile)>();
@@ -549,7 +559,7 @@
 
   late final _clang_equalLocationsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXSourceLocation, CXSourceLocation)>>('clang_equalLocations');
   late final _clang_equalLocations = _clang_equalLocationsPtr
       .asFunction<int Function(CXSourceLocation, CXSourceLocation)>();
@@ -572,8 +582,8 @@
 
   late final _clang_getLocationPtr = _lookup<
       ffi.NativeFunction<
-          CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.Uint32,
-              ffi.Uint32)>>('clang_getLocation');
+          CXSourceLocation Function(CXTranslationUnit, CXFile,
+              pkg_ffi.UnsignedInt, pkg_ffi.UnsignedInt)>>('clang_getLocation');
   late final _clang_getLocation = _clang_getLocationPtr.asFunction<
       CXSourceLocation Function(CXTranslationUnit, CXFile, int, int)>();
 
@@ -594,7 +604,7 @@
   late final _clang_getLocationForOffsetPtr = _lookup<
       ffi.NativeFunction<
           CXSourceLocation Function(CXTranslationUnit, CXFile,
-              ffi.Uint32)>>('clang_getLocationForOffset');
+              pkg_ffi.UnsignedInt)>>('clang_getLocationForOffset');
   late final _clang_getLocationForOffset = _clang_getLocationForOffsetPtr
       .asFunction<CXSourceLocation Function(CXTranslationUnit, CXFile, int)>();
 
@@ -608,7 +618,7 @@
   }
 
   late final _clang_Location_isInSystemHeaderPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXSourceLocation)>>(
           'clang_Location_isInSystemHeader');
   late final _clang_Location_isInSystemHeader =
       _clang_Location_isInSystemHeaderPtr
@@ -625,7 +635,7 @@
   }
 
   late final _clang_Location_isFromMainFilePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXSourceLocation)>>(
           'clang_Location_isFromMainFile');
   late final _clang_Location_isFromMainFile = _clang_Location_isFromMainFilePtr
       .asFunction<int Function(CXSourceLocation)>();
@@ -672,7 +682,7 @@
 
   late final _clang_equalRangesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXSourceRange, CXSourceRange)>>('clang_equalRanges');
   late final _clang_equalRanges = _clang_equalRangesPtr
       .asFunction<int Function(CXSourceRange, CXSourceRange)>();
@@ -687,7 +697,7 @@
   }
 
   late final _clang_Range_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceRange)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXSourceRange)>>(
           'clang_Range_isNull');
   late final _clang_Range_isNull =
       _clang_Range_isNullPtr.asFunction<int Function(CXSourceRange)>();
@@ -697,9 +707,9 @@
   void clang_getExpansionLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getExpansionLocation(
       location,
@@ -715,25 +725,25 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getExpansionLocation');
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getExpansionLocation');
   late final _clang_getExpansionLocation =
       _clang_getExpansionLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line and column represented by the given source
   /// location, as specified in a # line directive.
   void clang_getPresumedLocation(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
   ) {
     return _clang_getPresumedLocation(
       location,
@@ -748,21 +758,24 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getPresumedLocation');
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getPresumedLocation');
   late final _clang_getPresumedLocation =
       _clang_getPresumedLocationPtr.asFunction<
-          void Function(CXSourceLocation, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>, ffi.Pointer<ffi.Uint32>)>();
+          void Function(
+              CXSourceLocation,
+              ffi.Pointer<CXString>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Legacy API to retrieve the file, line, column, and offset represented by
   /// the given source location.
   void clang_getInstantiationLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getInstantiationLocation(
       location,
@@ -774,30 +787,31 @@
   }
 
   late final _clang_getInstantiationLocationPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Void Function(
-              CXSourceLocation,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getInstantiationLocation');
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  CXSourceLocation,
+                  ffi.Pointer<CXFile>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
+      'clang_getInstantiationLocation');
   late final _clang_getInstantiationLocation =
       _clang_getInstantiationLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line, column, and offset represented by the given
   /// source location.
   void clang_getSpellingLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getSpellingLocation(
       location,
@@ -813,26 +827,26 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getSpellingLocation');
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getSpellingLocation');
   late final _clang_getSpellingLocation =
       _clang_getSpellingLocationPtr.asFunction<
           void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Retrieve the file, line, column, and offset represented by the given
   /// source location.
   void clang_getFileLocation(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_getFileLocation(
       location,
@@ -848,16 +862,16 @@
           ffi.Void Function(
               CXSourceLocation,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getFileLocation');
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getFileLocation');
   late final _clang_getFileLocation = _clang_getFileLocationPtr.asFunction<
       void Function(
           CXSourceLocation,
           ffi.Pointer<CXFile>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>)>();
+          ffi.Pointer<pkg_ffi.UnsignedInt>,
+          ffi.Pointer<pkg_ffi.UnsignedInt>,
+          ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Retrieve a source location representing the first character within a
   /// source range.
@@ -950,9 +964,9 @@
     );
   }
 
-  late final _clang_getNumDiagnosticsInSetPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnosticSet)>>(
-          'clang_getNumDiagnosticsInSet');
+  late final _clang_getNumDiagnosticsInSetPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXDiagnosticSet)>>(
+      'clang_getNumDiagnosticsInSet');
   late final _clang_getNumDiagnosticsInSet = _clang_getNumDiagnosticsInSetPtr
       .asFunction<int Function(CXDiagnosticSet)>();
 
@@ -969,14 +983,14 @@
 
   late final _clang_getDiagnosticInSetPtr = _lookup<
       ffi.NativeFunction<
-          CXDiagnostic Function(
-              CXDiagnosticSet, ffi.Uint32)>>('clang_getDiagnosticInSet');
+          CXDiagnostic Function(CXDiagnosticSet,
+              pkg_ffi.UnsignedInt)>>('clang_getDiagnosticInSet');
   late final _clang_getDiagnosticInSet = _clang_getDiagnosticInSetPtr
       .asFunction<CXDiagnostic Function(CXDiagnosticSet, int)>();
 
   /// Deserialize a set of diagnostics from a Clang diagnostics bitcode file.
   CXDiagnosticSet clang_loadDiagnostics(
-    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<pkg_ffi.Char> file,
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
@@ -990,12 +1004,12 @@
   late final _clang_loadDiagnosticsPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnosticSet Function(
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<ffi.Int32>,
               ffi.Pointer<CXString>)>>('clang_loadDiagnostics');
   late final _clang_loadDiagnostics = _clang_loadDiagnosticsPtr.asFunction<
-      CXDiagnosticSet Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<CXString>)>();
+      CXDiagnosticSet Function(ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<ffi.Int32>, ffi.Pointer<CXString>)>();
 
   /// Release a CXDiagnosticSet and all of its contained diagnostics.
   void clang_disposeDiagnosticSet(
@@ -1037,9 +1051,9 @@
     );
   }
 
-  late final _clang_getNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
-          'clang_getNumDiagnostics');
+  late final _clang_getNumDiagnosticsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXTranslationUnit)>>(
+      'clang_getNumDiagnostics');
   late final _clang_getNumDiagnostics =
       _clang_getNumDiagnosticsPtr.asFunction<int Function(CXTranslationUnit)>();
 
@@ -1057,7 +1071,7 @@
   late final _clang_getDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(
-              CXTranslationUnit, ffi.Uint32)>>('clang_getDiagnostic');
+              CXTranslationUnit, pkg_ffi.UnsignedInt)>>('clang_getDiagnostic');
   late final _clang_getDiagnostic = _clang_getDiagnosticPtr
       .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();
 
@@ -1103,9 +1117,10 @@
     );
   }
 
-  late final _clang_formatDiagnosticPtr =
-      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.Uint32)>>(
-          'clang_formatDiagnostic');
+  late final _clang_formatDiagnosticPtr = _lookup<
+      ffi.NativeFunction<
+          CXString Function(
+              CXDiagnostic, pkg_ffi.UnsignedInt)>>('clang_formatDiagnostic');
   late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr
       .asFunction<CXString Function(CXDiagnostic, int)>();
 
@@ -1116,7 +1131,7 @@
   }
 
   late final _clang_defaultDiagnosticDisplayOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function()>>(
           'clang_defaultDiagnosticDisplayOptions');
   late final _clang_defaultDiagnosticDisplayOptions =
       _clang_defaultDiagnosticDisplayOptionsPtr.asFunction<int Function()>();
@@ -1194,7 +1209,7 @@
   }
 
   late final _clang_getDiagnosticCategoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticCategory');
   late final _clang_getDiagnosticCategory =
       _clang_getDiagnosticCategoryPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1210,7 +1225,7 @@
   }
 
   late final _clang_getDiagnosticCategoryNamePtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXString Function(pkg_ffi.UnsignedInt)>>(
           'clang_getDiagnosticCategoryName');
   late final _clang_getDiagnosticCategoryName =
       _clang_getDiagnosticCategoryNamePtr.asFunction<CXString Function(int)>();
@@ -1242,7 +1257,7 @@
   }
 
   late final _clang_getDiagnosticNumRangesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticNumRanges');
   late final _clang_getDiagnosticNumRanges =
       _clang_getDiagnosticNumRangesPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1259,8 +1274,9 @@
   }
 
   late final _clang_getDiagnosticRangePtr = _lookup<
-          ffi.NativeFunction<CXSourceRange Function(CXDiagnostic, ffi.Uint32)>>(
-      'clang_getDiagnosticRange');
+      ffi.NativeFunction<
+          CXSourceRange Function(
+              CXDiagnostic, pkg_ffi.UnsignedInt)>>('clang_getDiagnosticRange');
   late final _clang_getDiagnosticRange = _clang_getDiagnosticRangePtr
       .asFunction<CXSourceRange Function(CXDiagnostic, int)>();
 
@@ -1274,7 +1290,7 @@
   }
 
   late final _clang_getDiagnosticNumFixItsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXDiagnostic)>>(
           'clang_getDiagnosticNumFixIts');
   late final _clang_getDiagnosticNumFixIts =
       _clang_getDiagnosticNumFixItsPtr.asFunction<int Function(CXDiagnostic)>();
@@ -1294,7 +1310,7 @@
 
   late final _clang_getDiagnosticFixItPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(CXDiagnostic, ffi.Uint32,
+          CXString Function(CXDiagnostic, pkg_ffi.UnsignedInt,
               ffi.Pointer<CXSourceRange>)>>('clang_getDiagnosticFixIt');
   late final _clang_getDiagnosticFixIt =
       _clang_getDiagnosticFixItPtr.asFunction<
@@ -1320,9 +1336,9 @@
   /// command line arguments one would pass to the compiler.
   CXTranslationUnit clang_createTranslationUnitFromSourceFile(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
     int num_clang_command_line_args,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> clang_command_line_args,
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
@@ -1340,19 +1356,19 @@
           ffi.NativeFunction<
               CXTranslationUnit Function(
                   CXIndex,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Uint32,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  pkg_ffi.UnsignedInt,
                   ffi.Pointer<CXUnsavedFile>)>>(
       'clang_createTranslationUnitFromSourceFile');
   late final _clang_createTranslationUnitFromSourceFile =
       _clang_createTranslationUnitFromSourceFilePtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>)>();
 
@@ -1361,7 +1377,7 @@
   /// CXTranslationUnit, without further detailed error codes.
   CXTranslationUnit clang_createTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
   ) {
     return _clang_createTranslationUnit(
       CIdx,
@@ -1371,15 +1387,16 @@
 
   late final _clang_createTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          CXTranslationUnit Function(
-              CXIndex, ffi.Pointer<ffi.Int8>)>>('clang_createTranslationUnit');
-  late final _clang_createTranslationUnit = _clang_createTranslationUnitPtr
-      .asFunction<CXTranslationUnit Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+          CXTranslationUnit Function(CXIndex,
+              ffi.Pointer<pkg_ffi.Char>)>>('clang_createTranslationUnit');
+  late final _clang_createTranslationUnit =
+      _clang_createTranslationUnitPtr.asFunction<
+          CXTranslationUnit Function(CXIndex, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Create a translation unit from an AST file ( -emit-ast).
   int clang_createTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<pkg_ffi.Char> ast_filename,
     ffi.Pointer<CXTranslationUnit> out_TU,
   ) {
     return _clang_createTranslationUnit2(
@@ -1391,11 +1408,11 @@
 
   late final _clang_createTranslationUnit2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(CXIndex, ffi.Pointer<ffi.Int8>,
+          ffi.Int32 Function(CXIndex, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<CXTranslationUnit>)>>('clang_createTranslationUnit2');
   late final _clang_createTranslationUnit2 =
       _clang_createTranslationUnit2Ptr.asFunction<
-          int Function(CXIndex, ffi.Pointer<ffi.Int8>,
+          int Function(CXIndex, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<CXTranslationUnit>)>();
 
   /// Returns the set of flags that is suitable for parsing a translation unit
@@ -1405,7 +1422,7 @@
   }
 
   late final _clang_defaultEditingTranslationUnitOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function()>>(
           'clang_defaultEditingTranslationUnitOptions');
   late final _clang_defaultEditingTranslationUnitOptions =
       _clang_defaultEditingTranslationUnitOptionsPtr
@@ -1416,8 +1433,8 @@
   /// CXTranslationUnit, without further detailed error codes.
   CXTranslationUnit clang_parseTranslationUnit(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1438,18 +1455,18 @@
       ffi.NativeFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_parseTranslationUnit');
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>>('clang_parseTranslationUnit');
   late final _clang_parseTranslationUnit =
       _clang_parseTranslationUnitPtr.asFunction<
           CXTranslationUnit Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1459,8 +1476,8 @@
   /// file.
   int clang_parseTranslationUnit2(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1483,19 +1500,19 @@
       ffi.NativeFunction<
           ffi.Int32 Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>)>>('clang_parseTranslationUnit2');
   late final _clang_parseTranslationUnit2 =
       _clang_parseTranslationUnit2Ptr.asFunction<
           int Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1507,8 +1524,8 @@
   /// library paths are relative to the binary.
   int clang_parseTranslationUnit2FullArgv(
     CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -1531,20 +1548,20 @@
           ffi.NativeFunction<
               ffi.Int32 Function(
                   CXIndex,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Int32,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  pkg_ffi.Int,
                   ffi.Pointer<CXUnsavedFile>,
-                  ffi.Uint32,
-                  ffi.Uint32,
+                  pkg_ffi.UnsignedInt,
+                  pkg_ffi.UnsignedInt,
                   ffi.Pointer<CXTranslationUnit>)>>(
       'clang_parseTranslationUnit2FullArgv');
   late final _clang_parseTranslationUnit2FullArgv =
       _clang_parseTranslationUnit2FullArgvPtr.asFunction<
           int Function(
               CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -1560,9 +1577,9 @@
     );
   }
 
-  late final _clang_defaultSaveOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
-          'clang_defaultSaveOptions');
+  late final _clang_defaultSaveOptionsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXTranslationUnit)>>(
+      'clang_defaultSaveOptions');
   late final _clang_defaultSaveOptions = _clang_defaultSaveOptionsPtr
       .asFunction<int Function(CXTranslationUnit)>();
 
@@ -1570,7 +1587,7 @@
   /// translation unit on disk.
   int clang_saveTranslationUnit(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> FileName,
+    ffi.Pointer<pkg_ffi.Char> FileName,
     int options,
   ) {
     return _clang_saveTranslationUnit(
@@ -1582,11 +1599,11 @@
 
   late final _clang_saveTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>,
-              ffi.Uint32)>>('clang_saveTranslationUnit');
+          pkg_ffi.Int Function(CXTranslationUnit, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.UnsignedInt)>>('clang_saveTranslationUnit');
   late final _clang_saveTranslationUnit =
       _clang_saveTranslationUnitPtr.asFunction<
-          int Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>, int)>();
+          int Function(CXTranslationUnit, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// Suspend a translation unit in order to free memory associated with it.
   int clang_suspendTranslationUnit(
@@ -1597,9 +1614,9 @@
     );
   }
 
-  late final _clang_suspendTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
-          'clang_suspendTranslationUnit');
+  late final _clang_suspendTranslationUnitPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXTranslationUnit)>>(
+      'clang_suspendTranslationUnit');
   late final _clang_suspendTranslationUnit = _clang_suspendTranslationUnitPtr
       .asFunction<int Function(CXTranslationUnit)>();
 
@@ -1628,9 +1645,9 @@
     );
   }
 
-  late final _clang_defaultReparseOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
-          'clang_defaultReparseOptions');
+  late final _clang_defaultReparseOptionsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXTranslationUnit)>>(
+      'clang_defaultReparseOptions');
   late final _clang_defaultReparseOptions = _clang_defaultReparseOptionsPtr
       .asFunction<int Function(CXTranslationUnit)>();
 
@@ -1651,11 +1668,11 @@
 
   late final _clang_reparseTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXTranslationUnit,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32)>>('clang_reparseTranslationUnit');
+              pkg_ffi.UnsignedInt)>>('clang_reparseTranslationUnit');
   late final _clang_reparseTranslationUnit =
       _clang_reparseTranslationUnitPtr.asFunction<
           int Function(
@@ -1663,7 +1680,7 @@
 
   /// Returns the human-readable null-terminated C string that represents the
   /// name of the memory category. This string should never be freed.
-  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
+  ffi.Pointer<pkg_ffi.Char> clang_getTUResourceUsageName(
     int kind,
   ) {
     return _clang_getTUResourceUsageName(
@@ -1671,11 +1688,11 @@
     );
   }
 
-  late final _clang_getTUResourceUsageNamePtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
-          'clang_getTUResourceUsageName');
+  late final _clang_getTUResourceUsageNamePtr = _lookup<
+          ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Int32)>>(
+      'clang_getTUResourceUsageName');
   late final _clang_getTUResourceUsageName = _clang_getTUResourceUsageNamePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(int)>();
 
   /// Return the memory usage of a translation unit. This object should be
   /// released with clang_disposeCXTUResourceUsage().
@@ -1764,7 +1781,7 @@
   }
 
   late final _clang_TargetInfo_getPointerWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXTargetInfo)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXTargetInfo)>>(
           'clang_TargetInfo_getPointerWidth');
   late final _clang_TargetInfo_getPointerWidth =
       _clang_TargetInfo_getPointerWidthPtr
@@ -1807,9 +1824,9 @@
     );
   }
 
-  late final _clang_equalCursorsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, CXCursor)>>(
-          'clang_equalCursors');
+  late final _clang_equalCursorsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor, CXCursor)>>(
+      'clang_equalCursors');
   late final _clang_equalCursors =
       _clang_equalCursorsPtr.asFunction<int Function(CXCursor, CXCursor)>();
 
@@ -1823,7 +1840,7 @@
   }
 
   late final _clang_Cursor_isNullPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isNull');
   late final _clang_Cursor_isNull =
       _clang_Cursor_isNullPtr.asFunction<int Function(CXCursor)>();
@@ -1838,7 +1855,7 @@
   }
 
   late final _clang_hashCursorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_hashCursor');
   late final _clang_hashCursor =
       _clang_hashCursorPtr.asFunction<int Function(CXCursor)>();
@@ -1868,7 +1885,7 @@
   }
 
   late final _clang_isDeclarationPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isDeclaration');
   late final _clang_isDeclaration =
       _clang_isDeclarationPtr.asFunction<int Function(int)>();
@@ -1883,7 +1900,7 @@
   }
 
   late final _clang_isInvalidDeclarationPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isInvalidDeclaration');
   late final _clang_isInvalidDeclaration =
       _clang_isInvalidDeclarationPtr.asFunction<int Function(CXCursor)>();
@@ -1898,7 +1915,7 @@
   }
 
   late final _clang_isReferencePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isReference');
   late final _clang_isReference =
       _clang_isReferencePtr.asFunction<int Function(int)>();
@@ -1913,7 +1930,7 @@
   }
 
   late final _clang_isExpressionPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isExpression');
   late final _clang_isExpression =
       _clang_isExpressionPtr.asFunction<int Function(int)>();
@@ -1928,7 +1945,7 @@
   }
 
   late final _clang_isStatementPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isStatement');
   late final _clang_isStatement =
       _clang_isStatementPtr.asFunction<int Function(int)>();
@@ -1943,7 +1960,7 @@
   }
 
   late final _clang_isAttributePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isAttribute');
   late final _clang_isAttribute =
       _clang_isAttributePtr.asFunction<int Function(int)>();
@@ -1958,7 +1975,7 @@
   }
 
   late final _clang_Cursor_hasAttrsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_hasAttrs');
   late final _clang_Cursor_hasAttrs =
       _clang_Cursor_hasAttrsPtr.asFunction<int Function(CXCursor)>();
@@ -1973,7 +1990,7 @@
   }
 
   late final _clang_isInvalidPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isInvalid');
   late final _clang_isInvalid =
       _clang_isInvalidPtr.asFunction<int Function(int)>();
@@ -1988,7 +2005,7 @@
   }
 
   late final _clang_isTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isTranslationUnit');
   late final _clang_isTranslationUnit =
       _clang_isTranslationUnitPtr.asFunction<int Function(int)>();
@@ -2004,7 +2021,7 @@
   }
 
   late final _clang_isPreprocessingPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isPreprocessing');
   late final _clang_isPreprocessing =
       _clang_isPreprocessingPtr.asFunction<int Function(int)>();
@@ -2020,7 +2037,7 @@
   }
 
   late final _clang_isUnexposedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(ffi.Int32)>>(
           'clang_isUnexposed');
   late final _clang_isUnexposed =
       _clang_isUnexposedPtr.asFunction<int Function(int)>();
@@ -2075,9 +2092,9 @@
   /// platforms for which availability information is known.
   int clang_getCursorPlatformAvailability(
     CXCursor cursor,
-    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<pkg_ffi.Int> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
-    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<pkg_ffi.Int> always_unavailable,
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     int availability_size,
@@ -2095,21 +2112,21 @@
 
   late final _clang_getCursorPlatformAvailabilityPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXCursor,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<pkg_ffi.Int>,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<pkg_ffi.Int>,
               ffi.Pointer<CXString>,
               ffi.Pointer<CXPlatformAvailability>,
-              ffi.Int32)>>('clang_getCursorPlatformAvailability');
+              pkg_ffi.Int)>>('clang_getCursorPlatformAvailability');
   late final _clang_getCursorPlatformAvailability =
       _clang_getCursorPlatformAvailabilityPtr.asFunction<
           int Function(
               CXCursor,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<pkg_ffi.Int>,
               ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Int32>,
+              ffi.Pointer<pkg_ffi.Int>,
               ffi.Pointer<CXString>,
               ffi.Pointer<CXPlatformAvailability>,
               int)>();
@@ -2215,9 +2232,10 @@
     );
   }
 
-  late final _clang_CXCursorSet_containsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
-          'clang_CXCursorSet_contains');
+  late final _clang_CXCursorSet_containsPtr = _lookup<
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(
+              CXCursorSet, CXCursor)>>('clang_CXCursorSet_contains');
   late final _clang_CXCursorSet_contains = _clang_CXCursorSet_containsPtr
       .asFunction<int Function(CXCursorSet, CXCursor)>();
 
@@ -2232,9 +2250,10 @@
     );
   }
 
-  late final _clang_CXCursorSet_insertPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
-          'clang_CXCursorSet_insert');
+  late final _clang_CXCursorSet_insertPtr = _lookup<
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(
+              CXCursorSet, CXCursor)>>('clang_CXCursorSet_insert');
   late final _clang_CXCursorSet_insert = _clang_CXCursorSet_insertPtr
       .asFunction<int Function(CXCursorSet, CXCursor)>();
 
@@ -2272,7 +2291,7 @@
   void clang_getOverriddenCursors(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
-    ffi.Pointer<ffi.Uint32> num_overridden,
+    ffi.Pointer<pkg_ffi.UnsignedInt> num_overridden,
   ) {
     return _clang_getOverriddenCursors(
       cursor,
@@ -2284,11 +2303,11 @@
   late final _clang_getOverriddenCursorsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_getOverriddenCursors');
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_getOverriddenCursors');
   late final _clang_getOverriddenCursors =
       _clang_getOverriddenCursorsPtr.asFunction<
           void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Free the set of overridden cursors returned by
   /// clang_getOverriddenCursors().
@@ -2447,7 +2466,7 @@
   }
 
   late final _clang_getEnumConstantDeclValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclValue');
   late final _clang_getEnumConstantDeclValue =
       _clang_getEnumConstantDeclValuePtr.asFunction<int Function(CXCursor)>();
@@ -2463,7 +2482,7 @@
   }
 
   late final _clang_getEnumConstantDeclUnsignedValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedLongLong Function(CXCursor)>>(
           'clang_getEnumConstantDeclUnsignedValue');
   late final _clang_getEnumConstantDeclUnsignedValue =
       _clang_getEnumConstantDeclUnsignedValuePtr
@@ -2479,7 +2498,7 @@
   }
 
   late final _clang_getFieldDeclBitWidthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_getFieldDeclBitWidth');
   late final _clang_getFieldDeclBitWidth =
       _clang_getFieldDeclBitWidthPtr.asFunction<int Function(CXCursor)>();
@@ -2495,7 +2514,7 @@
   }
 
   late final _clang_Cursor_getNumArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumArguments');
   late final _clang_Cursor_getNumArguments =
       _clang_Cursor_getNumArgumentsPtr.asFunction<int Function(CXCursor)>();
@@ -2511,9 +2530,9 @@
     );
   }
 
-  late final _clang_Cursor_getArgumentPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getArgument');
+  late final _clang_Cursor_getArgumentPtr = _lookup<
+          ffi.NativeFunction<CXCursor Function(CXCursor, pkg_ffi.UnsignedInt)>>(
+      'clang_Cursor_getArgument');
   late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
 
@@ -2528,7 +2547,7 @@
   }
 
   late final _clang_Cursor_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getNumTemplateArguments');
   late final _clang_Cursor_getNumTemplateArguments =
       _clang_Cursor_getNumTemplateArgumentsPtr
@@ -2545,9 +2564,10 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentKindPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentKind');
+  late final _clang_Cursor_getTemplateArgumentKindPtr = _lookup<
+      ffi.NativeFunction<
+          ffi.Int32 Function(CXCursor,
+              pkg_ffi.UnsignedInt)>>('clang_Cursor_getTemplateArgumentKind');
   late final _clang_Cursor_getTemplateArgumentKind =
       _clang_Cursor_getTemplateArgumentKindPtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2564,9 +2584,9 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentType');
+  late final _clang_Cursor_getTemplateArgumentTypePtr = _lookup<
+          ffi.NativeFunction<CXType Function(CXCursor, pkg_ffi.UnsignedInt)>>(
+      'clang_Cursor_getTemplateArgumentType');
   late final _clang_Cursor_getTemplateArgumentType =
       _clang_Cursor_getTemplateArgumentTypePtr
           .asFunction<CXType Function(CXCursor, int)>();
@@ -2583,9 +2603,10 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentValue');
+  late final _clang_Cursor_getTemplateArgumentValuePtr = _lookup<
+      ffi.NativeFunction<
+          pkg_ffi.LongLong Function(CXCursor,
+              pkg_ffi.UnsignedInt)>>('clang_Cursor_getTemplateArgumentValue');
   late final _clang_Cursor_getTemplateArgumentValue =
       _clang_Cursor_getTemplateArgumentValuePtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2602,9 +2623,11 @@
     );
   }
 
-  late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getTemplateArgumentUnsignedValue');
+  late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr = _lookup<
+          ffi.NativeFunction<
+              pkg_ffi.UnsignedLongLong Function(
+                  CXCursor, pkg_ffi.UnsignedInt)>>(
+      'clang_Cursor_getTemplateArgumentUnsignedValue');
   late final _clang_Cursor_getTemplateArgumentUnsignedValue =
       _clang_Cursor_getTemplateArgumentUnsignedValuePtr
           .asFunction<int Function(CXCursor, int)>();
@@ -2621,7 +2644,7 @@
   }
 
   late final _clang_equalTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType, CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType, CXType)>>(
           'clang_equalTypes');
   late final _clang_equalTypes =
       _clang_equalTypesPtr.asFunction<int Function(CXType, CXType)>();
@@ -2652,7 +2675,7 @@
   }
 
   late final _clang_isConstQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_isConstQualifiedType');
   late final _clang_isConstQualifiedType =
       _clang_isConstQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2667,7 +2690,7 @@
   }
 
   late final _clang_Cursor_isMacroFunctionLikePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroFunctionLike');
   late final _clang_Cursor_isMacroFunctionLike =
       _clang_Cursor_isMacroFunctionLikePtr.asFunction<int Function(CXCursor)>();
@@ -2682,7 +2705,7 @@
   }
 
   late final _clang_Cursor_isMacroBuiltinPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isMacroBuiltin');
   late final _clang_Cursor_isMacroBuiltin =
       _clang_Cursor_isMacroBuiltinPtr.asFunction<int Function(CXCursor)>();
@@ -2698,7 +2721,7 @@
   }
 
   late final _clang_Cursor_isFunctionInlinedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isFunctionInlined');
   late final _clang_Cursor_isFunctionInlined =
       _clang_Cursor_isFunctionInlinedPtr.asFunction<int Function(CXCursor)>();
@@ -2715,7 +2738,7 @@
   }
 
   late final _clang_isVolatileQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_isVolatileQualifiedType');
   late final _clang_isVolatileQualifiedType =
       _clang_isVolatileQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2732,7 +2755,7 @@
   }
 
   late final _clang_isRestrictQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_isRestrictQualifiedType');
   late final _clang_isRestrictQualifiedType =
       _clang_isRestrictQualifiedTypePtr.asFunction<int Function(CXType)>();
@@ -2747,7 +2770,7 @@
   }
 
   late final _clang_getAddressSpacePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_getAddressSpace');
   late final _clang_getAddressSpace =
       _clang_getAddressSpacePtr.asFunction<int Function(CXType)>();
@@ -2883,7 +2906,7 @@
   }
 
   late final _clang_getExceptionSpecificationTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXType)>>(
           'clang_getExceptionSpecificationType');
   late final _clang_getExceptionSpecificationType =
       _clang_getExceptionSpecificationTypePtr
@@ -2900,7 +2923,7 @@
   }
 
   late final _clang_getNumArgTypesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXType)>>(
           'clang_getNumArgTypes');
   late final _clang_getNumArgTypes =
       _clang_getNumArgTypesPtr.asFunction<int Function(CXType)>();
@@ -2917,7 +2940,7 @@
   }
 
   late final _clang_getArgTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, pkg_ffi.UnsignedInt)>>(
           'clang_getArgType');
   late final _clang_getArgType =
       _clang_getArgTypePtr.asFunction<CXType Function(CXType, int)>();
@@ -2949,7 +2972,7 @@
   }
 
   late final _clang_Type_getNumObjCProtocolRefsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_getNumObjCProtocolRefs');
   late final _clang_Type_getNumObjCProtocolRefs =
       _clang_Type_getNumObjCProtocolRefsPtr.asFunction<int Function(CXType)>();
@@ -2965,9 +2988,9 @@
     );
   }
 
-  late final _clang_Type_getObjCProtocolDeclPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXType, ffi.Uint32)>>(
-          'clang_Type_getObjCProtocolDecl');
+  late final _clang_Type_getObjCProtocolDeclPtr = _lookup<
+          ffi.NativeFunction<CXCursor Function(CXType, pkg_ffi.UnsignedInt)>>(
+      'clang_Type_getObjCProtocolDecl');
   late final _clang_Type_getObjCProtocolDecl =
       _clang_Type_getObjCProtocolDeclPtr
           .asFunction<CXCursor Function(CXType, int)>();
@@ -2982,7 +3005,7 @@
   }
 
   late final _clang_Type_getNumObjCTypeArgsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_getNumObjCTypeArgs');
   late final _clang_Type_getNumObjCTypeArgs =
       _clang_Type_getNumObjCTypeArgsPtr.asFunction<int Function(CXType)>();
@@ -2999,7 +3022,7 @@
   }
 
   late final _clang_Type_getObjCTypeArgPtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, pkg_ffi.UnsignedInt)>>(
           'clang_Type_getObjCTypeArg');
   late final _clang_Type_getObjCTypeArg =
       _clang_Type_getObjCTypeArgPtr.asFunction<CXType Function(CXType, int)>();
@@ -3014,7 +3037,7 @@
   }
 
   late final _clang_isFunctionTypeVariadicPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_isFunctionTypeVariadic');
   late final _clang_isFunctionTypeVariadic =
       _clang_isFunctionTypeVariadicPtr.asFunction<int Function(CXType)>();
@@ -3045,7 +3068,7 @@
   }
 
   late final _clang_getCursorExceptionSpecificationTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_getCursorExceptionSpecificationType');
   late final _clang_getCursorExceptionSpecificationType =
       _clang_getCursorExceptionSpecificationTypePtr
@@ -3061,7 +3084,7 @@
   }
 
   late final _clang_isPODTypePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_isPODType');
   late final _clang_isPODType =
       _clang_isPODTypePtr.asFunction<int Function(CXType)>();
@@ -3091,7 +3114,7 @@
   }
 
   late final _clang_getNumElementsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_getNumElements');
   late final _clang_getNumElements =
       _clang_getNumElementsPtr.asFunction<int Function(CXType)>();
@@ -3121,7 +3144,7 @@
   }
 
   late final _clang_getArraySizePtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_getArraySize');
   late final _clang_getArraySize =
       _clang_getArraySizePtr.asFunction<int Function(CXType)>();
@@ -3151,7 +3174,7 @@
   }
 
   late final _clang_Type_isTransparentTagTypedefPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXType)>>(
           'clang_Type_isTransparentTagTypedef');
   late final _clang_Type_isTransparentTagTypedef =
       _clang_Type_isTransparentTagTypedefPtr.asFunction<int Function(CXType)>();
@@ -3181,7 +3204,7 @@
   }
 
   late final _clang_Type_getAlignOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_Type_getAlignOf');
   late final _clang_Type_getAlignOf =
       _clang_Type_getAlignOfPtr.asFunction<int Function(CXType)>();
@@ -3211,7 +3234,7 @@
   }
 
   late final _clang_Type_getSizeOfPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXType)>>(
           'clang_Type_getSizeOf');
   late final _clang_Type_getSizeOf =
       _clang_Type_getSizeOfPtr.asFunction<int Function(CXType)>();
@@ -3220,7 +3243,7 @@
   /// would be returned by __offsetof__ as per C++11[18.2p4]
   int clang_Type_getOffsetOf(
     CXType T,
-    ffi.Pointer<ffi.Int8> S,
+    ffi.Pointer<pkg_ffi.Char> S,
   ) {
     return _clang_Type_getOffsetOf(
       T,
@@ -3230,10 +3253,10 @@
 
   late final _clang_Type_getOffsetOfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int64 Function(
-              CXType, ffi.Pointer<ffi.Int8>)>>('clang_Type_getOffsetOf');
+          pkg_ffi.LongLong Function(
+              CXType, ffi.Pointer<pkg_ffi.Char>)>>('clang_Type_getOffsetOf');
   late final _clang_Type_getOffsetOf = _clang_Type_getOffsetOfPtr
-      .asFunction<int Function(CXType, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(CXType, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Return the type that was modified by this attributed type.
   CXType clang_Type_getModifiedType(
@@ -3260,7 +3283,7 @@
   }
 
   late final _clang_Cursor_getOffsetOfFieldPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXCursor)>>(
           'clang_Cursor_getOffsetOfField');
   late final _clang_Cursor_getOffsetOfField =
       _clang_Cursor_getOffsetOfFieldPtr.asFunction<int Function(CXCursor)>();
@@ -3276,7 +3299,7 @@
   }
 
   late final _clang_Cursor_isAnonymousPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymous');
   late final _clang_Cursor_isAnonymous =
       _clang_Cursor_isAnonymousPtr.asFunction<int Function(CXCursor)>();
@@ -3292,7 +3315,7 @@
   }
 
   late final _clang_Cursor_isAnonymousRecordDeclPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isAnonymousRecordDecl');
   late final _clang_Cursor_isAnonymousRecordDecl =
       _clang_Cursor_isAnonymousRecordDeclPtr
@@ -3309,7 +3332,7 @@
   }
 
   late final _clang_Cursor_isInlineNamespacePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isInlineNamespace');
   late final _clang_Cursor_isInlineNamespace =
       _clang_Cursor_isInlineNamespacePtr.asFunction<int Function(CXCursor)>();
@@ -3325,7 +3348,7 @@
   }
 
   late final _clang_Type_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXType)>>(
           'clang_Type_getNumTemplateArguments');
   late final _clang_Type_getNumTemplateArguments =
       _clang_Type_getNumTemplateArgumentsPtr.asFunction<int Function(CXType)>();
@@ -3343,7 +3366,7 @@
   }
 
   late final _clang_Type_getTemplateArgumentAsTypePtr =
-      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<CXType Function(CXType, pkg_ffi.UnsignedInt)>>(
           'clang_Type_getTemplateArgumentAsType');
   late final _clang_Type_getTemplateArgumentAsType =
       _clang_Type_getTemplateArgumentAsTypePtr
@@ -3375,7 +3398,7 @@
   }
 
   late final _clang_Cursor_isBitFieldPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isBitField');
   late final _clang_Cursor_isBitField =
       _clang_Cursor_isBitFieldPtr.asFunction<int Function(CXCursor)>();
@@ -3391,7 +3414,7 @@
   }
 
   late final _clang_isVirtualBasePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isVirtualBase');
   late final _clang_isVirtualBase =
       _clang_isVirtualBasePtr.asFunction<int Function(CXCursor)>();
@@ -3437,7 +3460,7 @@
   }
 
   late final _clang_getNumOverloadedDeclsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_getNumOverloadedDecls');
   late final _clang_getNumOverloadedDecls =
       _clang_getNumOverloadedDeclsPtr.asFunction<int Function(CXCursor)>();
@@ -3454,9 +3477,9 @@
     );
   }
 
-  late final _clang_getOverloadedDeclPtr =
-      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
-          'clang_getOverloadedDecl');
+  late final _clang_getOverloadedDeclPtr = _lookup<
+          ffi.NativeFunction<CXCursor Function(CXCursor, pkg_ffi.UnsignedInt)>>(
+      'clang_getOverloadedDecl');
   late final _clang_getOverloadedDecl = _clang_getOverloadedDeclPtr
       .asFunction<CXCursor Function(CXCursor, int)>();
 
@@ -3492,7 +3515,7 @@
 
   late final _clang_visitChildrenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXCursor, CXCursorVisitor, CXClientData)>>('clang_visitChildren');
   late final _clang_visitChildren = _clang_visitChildrenPtr
       .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();
@@ -3515,7 +3538,7 @@
 
   /// Construct a USR for a specified Objective-C class.
   CXString clang_constructUSR_ObjCClass(
-    ffi.Pointer<ffi.Int8> class_name,
+    ffi.Pointer<pkg_ffi.Char> class_name,
   ) {
     return _clang_constructUSR_ObjCClass(
       class_name,
@@ -3523,15 +3546,15 @@
   }
 
   late final _clang_constructUSR_ObjCClassPtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>)>>(
           'clang_constructUSR_ObjCClass');
   late final _clang_constructUSR_ObjCClass = _clang_constructUSR_ObjCClassPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C category.
   CXString clang_constructUSR_ObjCCategory(
-    ffi.Pointer<ffi.Int8> class_name,
-    ffi.Pointer<ffi.Int8> category_name,
+    ffi.Pointer<pkg_ffi.Char> class_name,
+    ffi.Pointer<pkg_ffi.Char> category_name,
   ) {
     return _clang_constructUSR_ObjCCategory(
       class_name,
@@ -3541,15 +3564,16 @@
 
   late final _clang_constructUSR_ObjCCategoryPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('clang_constructUSR_ObjCCategory');
+          CXString Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('clang_constructUSR_ObjCCategory');
   late final _clang_constructUSR_ObjCCategory =
       _clang_constructUSR_ObjCCategoryPtr.asFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          CXString Function(
+              ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C protocol.
   CXString clang_constructUSR_ObjCProtocol(
-    ffi.Pointer<ffi.Int8> protocol_name,
+    ffi.Pointer<pkg_ffi.Char> protocol_name,
   ) {
     return _clang_constructUSR_ObjCProtocol(
       protocol_name,
@@ -3557,16 +3581,16 @@
   }
 
   late final _clang_constructUSR_ObjCProtocolPtr =
-      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>)>>(
           'clang_constructUSR_ObjCProtocol');
   late final _clang_constructUSR_ObjCProtocol =
       _clang_constructUSR_ObjCProtocolPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+          .asFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Construct a USR for a specified Objective-C instance variable and the USR
   /// for its containing class.
   CXString clang_constructUSR_ObjCIvar(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCIvar(
@@ -3577,15 +3601,15 @@
 
   late final _clang_constructUSR_ObjCIvarPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(
-              ffi.Pointer<ffi.Int8>, CXString)>>('clang_constructUSR_ObjCIvar');
+          CXString Function(ffi.Pointer<pkg_ffi.Char>,
+              CXString)>>('clang_constructUSR_ObjCIvar');
   late final _clang_constructUSR_ObjCIvar = _clang_constructUSR_ObjCIvarPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+      .asFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>, CXString)>();
 
   /// Construct a USR for a specified Objective-C method and the USR for its
   /// containing class.
   CXString clang_constructUSR_ObjCMethod(
-    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<pkg_ffi.Char> name,
     int isInstanceMethod,
     CXString classUSR,
   ) {
@@ -3598,15 +3622,16 @@
 
   late final _clang_constructUSR_ObjCMethodPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Uint32,
+          CXString Function(ffi.Pointer<pkg_ffi.Char>, pkg_ffi.UnsignedInt,
               CXString)>>('clang_constructUSR_ObjCMethod');
-  late final _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethodPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, int, CXString)>();
+  late final _clang_constructUSR_ObjCMethod =
+      _clang_constructUSR_ObjCMethodPtr.asFunction<
+          CXString Function(ffi.Pointer<pkg_ffi.Char>, int, CXString)>();
 
   /// Construct a USR for a specified Objective-C property and the USR for its
   /// containing class.
   CXString clang_constructUSR_ObjCProperty(
-    ffi.Pointer<ffi.Int8> property,
+    ffi.Pointer<pkg_ffi.Char> property,
     CXString classUSR,
   ) {
     return _clang_constructUSR_ObjCProperty(
@@ -3617,11 +3642,11 @@
 
   late final _clang_constructUSR_ObjCPropertyPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>,
+          CXString Function(ffi.Pointer<pkg_ffi.Char>,
               CXString)>>('clang_constructUSR_ObjCProperty');
   late final _clang_constructUSR_ObjCProperty =
       _clang_constructUSR_ObjCPropertyPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+          .asFunction<CXString Function(ffi.Pointer<pkg_ffi.Char>, CXString)>();
 
   /// Retrieve a name for the entity referenced by this cursor.
   CXString clang_getCursorSpelling(
@@ -3656,8 +3681,8 @@
 
   late final _clang_Cursor_getSpellingNameRangePtr = _lookup<
       ffi.NativeFunction<
-          CXSourceRange Function(CXCursor, ffi.Uint32,
-              ffi.Uint32)>>('clang_Cursor_getSpellingNameRange');
+          CXSourceRange Function(CXCursor, pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>>('clang_Cursor_getSpellingNameRange');
   late final _clang_Cursor_getSpellingNameRange =
       _clang_Cursor_getSpellingNameRangePtr
           .asFunction<CXSourceRange Function(CXCursor, int, int)>();
@@ -3674,8 +3699,9 @@
   }
 
   late final _clang_PrintingPolicy_getPropertyPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXPrintingPolicy, ffi.Int32)>>(
-      'clang_PrintingPolicy_getProperty');
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(CXPrintingPolicy,
+              ffi.Int32)>>('clang_PrintingPolicy_getProperty');
   late final _clang_PrintingPolicy_getProperty =
       _clang_PrintingPolicy_getPropertyPtr
           .asFunction<int Function(CXPrintingPolicy, int)>();
@@ -3696,7 +3722,7 @@
   late final _clang_PrintingPolicy_setPropertyPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXPrintingPolicy, ffi.Int32,
-              ffi.Uint32)>>('clang_PrintingPolicy_setProperty');
+              pkg_ffi.UnsignedInt)>>('clang_PrintingPolicy_setProperty');
   late final _clang_PrintingPolicy_setProperty =
       _clang_PrintingPolicy_setPropertyPtr
           .asFunction<void Function(CXPrintingPolicy, int, int)>();
@@ -3806,7 +3832,7 @@
   }
 
   late final _clang_isCursorDefinitionPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_isCursorDefinition');
   late final _clang_isCursorDefinition =
       _clang_isCursorDefinitionPtr.asFunction<int Function(CXCursor)>();
@@ -3837,7 +3863,7 @@
   }
 
   late final _clang_Cursor_getObjCSelectorIndexPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_getObjCSelectorIndex');
   late final _clang_Cursor_getObjCSelectorIndex =
       _clang_Cursor_getObjCSelectorIndexPtr
@@ -3854,7 +3880,7 @@
   }
 
   late final _clang_Cursor_isDynamicCallPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXCursor)>>(
           'clang_Cursor_isDynamicCall');
   late final _clang_Cursor_isDynamicCall =
       _clang_Cursor_isDynamicCallPtr.asFunction<int Function(CXCursor)>();
@@ -3888,9 +3914,10 @@
     );
   }
 
-  late final _clang_Cursor_getObjCPropertyAttributesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, ffi.Uint32)>>(
-          'clang_Cursor_getObjCPropertyAttributes');
+  late final _clang_Cursor_getObjCPropertyAttributesPtr = _lookup<
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(CXCursor,
+              pkg_ffi.UnsignedInt)>>('clang_Cursor_getObjCPropertyAttributes');
   late final _clang_Cursor_getObjCPropertyAttributes =
       _clang_Cursor_getObjCPropertyAttributesPtr
           .asFunction<int Function(CXCursor, int)>();
@@ -3942,7 +3969,7 @@
   }
 
   late final _clang_Cursor_getObjCDeclQualifiersPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_getObjCDeclQualifiers');
   late final _clang_Cursor_getObjCDeclQualifiers =
       _clang_Cursor_getObjCDeclQualifiersPtr
@@ -3961,7 +3988,7 @@
   }
 
   late final _clang_Cursor_isObjCOptionalPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isObjCOptional');
   late final _clang_Cursor_isObjCOptional =
       _clang_Cursor_isObjCOptionalPtr.asFunction<int Function(CXCursor)>();
@@ -3976,7 +4003,7 @@
   }
 
   late final _clang_Cursor_isVariadicPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_Cursor_isVariadic');
   late final _clang_Cursor_isVariadic =
       _clang_Cursor_isVariadicPtr.asFunction<int Function(CXCursor)>();
@@ -3987,7 +4014,7 @@
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
-    ffi.Pointer<ffi.Uint32> isGenerated,
+    ffi.Pointer<pkg_ffi.UnsignedInt> isGenerated,
   ) {
     return _clang_Cursor_isExternalSymbol(
       C,
@@ -3998,16 +4025,14 @@
   }
 
   late final _clang_Cursor_isExternalSymbolPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Uint32 Function(
-              CXCursor,
-              ffi.Pointer<CXString>,
-              ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_Cursor_isExternalSymbol');
+          ffi.NativeFunction<
+              pkg_ffi.UnsignedInt Function(CXCursor, ffi.Pointer<CXString>,
+                  ffi.Pointer<CXString>, ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
+      'clang_Cursor_isExternalSymbol');
   late final _clang_Cursor_isExternalSymbol =
       _clang_Cursor_isExternalSymbolPtr.asFunction<
           int Function(CXCursor, ffi.Pointer<CXString>, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Given a cursor that represents a declaration, return the associated
   /// comment's source range. The range may include multiple consecutive
@@ -4212,7 +4237,7 @@
   }
 
   late final _clang_Module_isSystemPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXModule)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXModule)>>(
           'clang_Module_isSystem');
   late final _clang_Module_isSystem =
       _clang_Module_isSystemPtr.asFunction<int Function(CXModule)>();
@@ -4229,8 +4254,9 @@
   }
 
   late final _clang_Module_getNumTopLevelHeadersPtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXModule)>>(
-      'clang_Module_getNumTopLevelHeaders');
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(CXTranslationUnit,
+              CXModule)>>('clang_Module_getNumTopLevelHeaders');
   late final _clang_Module_getNumTopLevelHeaders =
       _clang_Module_getNumTopLevelHeadersPtr
           .asFunction<int Function(CXTranslationUnit, CXModule)>();
@@ -4251,7 +4277,7 @@
   late final _clang_Module_getTopLevelHeaderPtr = _lookup<
       ffi.NativeFunction<
           CXFile Function(CXTranslationUnit, CXModule,
-              ffi.Uint32)>>('clang_Module_getTopLevelHeader');
+              pkg_ffi.UnsignedInt)>>('clang_Module_getTopLevelHeader');
   late final _clang_Module_getTopLevelHeader =
       _clang_Module_getTopLevelHeaderPtr
           .asFunction<CXFile Function(CXTranslationUnit, CXModule, int)>();
@@ -4266,7 +4292,7 @@
   }
 
   late final _clang_CXXConstructor_isConvertingConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isConvertingConstructor');
   late final _clang_CXXConstructor_isConvertingConstructor =
       _clang_CXXConstructor_isConvertingConstructorPtr
@@ -4282,7 +4308,7 @@
   }
 
   late final _clang_CXXConstructor_isCopyConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isCopyConstructor');
   late final _clang_CXXConstructor_isCopyConstructor =
       _clang_CXXConstructor_isCopyConstructorPtr
@@ -4298,7 +4324,7 @@
   }
 
   late final _clang_CXXConstructor_isDefaultConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isDefaultConstructor');
   late final _clang_CXXConstructor_isDefaultConstructor =
       _clang_CXXConstructor_isDefaultConstructorPtr
@@ -4314,7 +4340,7 @@
   }
 
   late final _clang_CXXConstructor_isMoveConstructorPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXConstructor_isMoveConstructor');
   late final _clang_CXXConstructor_isMoveConstructor =
       _clang_CXXConstructor_isMoveConstructorPtr
@@ -4330,7 +4356,7 @@
   }
 
   late final _clang_CXXField_isMutablePtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXField_isMutable');
   late final _clang_CXXField_isMutable =
       _clang_CXXField_isMutablePtr.asFunction<int Function(CXCursor)>();
@@ -4345,7 +4371,7 @@
   }
 
   late final _clang_CXXMethod_isDefaultedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isDefaulted');
   late final _clang_CXXMethod_isDefaulted =
       _clang_CXXMethod_isDefaultedPtr.asFunction<int Function(CXCursor)>();
@@ -4361,7 +4387,7 @@
   }
 
   late final _clang_CXXMethod_isPureVirtualPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isPureVirtual');
   late final _clang_CXXMethod_isPureVirtual =
       _clang_CXXMethod_isPureVirtualPtr.asFunction<int Function(CXCursor)>();
@@ -4377,7 +4403,7 @@
   }
 
   late final _clang_CXXMethod_isStaticPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isStatic');
   late final _clang_CXXMethod_isStatic =
       _clang_CXXMethod_isStaticPtr.asFunction<int Function(CXCursor)>();
@@ -4394,7 +4420,7 @@
   }
 
   late final _clang_CXXMethod_isVirtualPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isVirtual');
   late final _clang_CXXMethod_isVirtual =
       _clang_CXXMethod_isVirtualPtr.asFunction<int Function(CXCursor)>();
@@ -4410,7 +4436,7 @@
   }
 
   late final _clang_CXXRecord_isAbstractPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXRecord_isAbstract');
   late final _clang_CXXRecord_isAbstract =
       _clang_CXXRecord_isAbstractPtr.asFunction<int Function(CXCursor)>();
@@ -4425,7 +4451,7 @@
   }
 
   late final _clang_EnumDecl_isScopedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_EnumDecl_isScoped');
   late final _clang_EnumDecl_isScoped =
       _clang_EnumDecl_isScopedPtr.asFunction<int Function(CXCursor)>();
@@ -4441,7 +4467,7 @@
   }
 
   late final _clang_CXXMethod_isConstPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCursor)>>(
           'clang_CXXMethod_isConst');
   late final _clang_CXXMethod_isConst =
       _clang_CXXMethod_isConstPtr.asFunction<int Function(CXCursor)>();
@@ -4496,8 +4522,8 @@
 
   late final _clang_getCursorReferenceNameRangePtr = _lookup<
       ffi.NativeFunction<
-          CXSourceRange Function(CXCursor, ffi.Uint32,
-              ffi.Uint32)>>('clang_getCursorReferenceNameRange');
+          CXSourceRange Function(CXCursor, pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>>('clang_getCursorReferenceNameRange');
   late final _clang_getCursorReferenceNameRange =
       _clang_getCursorReferenceNameRangePtr
           .asFunction<CXSourceRange Function(CXCursor, int, int)>();
@@ -4594,7 +4620,7 @@
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
-    ffi.Pointer<ffi.Uint32> NumTokens,
+    ffi.Pointer<pkg_ffi.UnsignedInt> NumTokens,
   ) {
     return _clang_tokenize(
       TU,
@@ -4610,10 +4636,13 @@
               CXTranslationUnit,
               CXSourceRange,
               ffi.Pointer<ffi.Pointer<CXToken>>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_tokenize');
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>>('clang_tokenize');
   late final _clang_tokenize = _clang_tokenizePtr.asFunction<
-      void Function(CXTranslationUnit, CXSourceRange,
-          ffi.Pointer<ffi.Pointer<CXToken>>, ffi.Pointer<ffi.Uint32>)>();
+      void Function(
+          CXTranslationUnit,
+          CXSourceRange,
+          ffi.Pointer<ffi.Pointer<CXToken>>,
+          ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Annotate the given set of tokens by providing cursors for each token that
   /// can be mapped to a specific entity within the abstract syntax tree.
@@ -4633,7 +4662,10 @@
 
   late final _clang_annotateTokensPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>, ffi.Uint32,
+          ffi.Void Function(
+              CXTranslationUnit,
+              ffi.Pointer<CXToken>,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXCursor>)>>('clang_annotateTokens');
   late final _clang_annotateTokens = _clang_annotateTokensPtr.asFunction<
       void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int,
@@ -4655,7 +4687,7 @@
   late final _clang_disposeTokensPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>,
-              ffi.Uint32)>>('clang_disposeTokens');
+              pkg_ffi.UnsignedInt)>>('clang_disposeTokens');
   late final _clang_disposeTokens = _clang_disposeTokensPtr.asFunction<
       void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int)>();
 
@@ -4677,12 +4709,12 @@
 
   void clang_getDefinitionSpellingAndExtent(
     CXCursor arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
-    ffi.Pointer<ffi.Uint32> startLine,
-    ffi.Pointer<ffi.Uint32> startColumn,
-    ffi.Pointer<ffi.Uint32> endLine,
-    ffi.Pointer<ffi.Uint32> endColumn,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> startBuf,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> endBuf,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> startColumn,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endLine,
+    ffi.Pointer<pkg_ffi.UnsignedInt> endColumn,
   ) {
     return _clang_getDefinitionSpellingAndExtent(
       arg0,
@@ -4699,23 +4731,23 @@
           ffi.NativeFunction<
               ffi.Void Function(
                   CXCursor,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>,
-                  ffi.Pointer<ffi.Uint32>)>>(
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
       'clang_getDefinitionSpellingAndExtent');
   late final _clang_getDefinitionSpellingAndExtent =
       _clang_getDefinitionSpellingAndExtentPtr.asFunction<
           void Function(
               CXCursor,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   void clang_enableStackTraces() {
     return _clang_enableStackTraces();
@@ -4746,7 +4778,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>,
-              ffi.Uint32)>>('clang_executeOnThread');
+              pkg_ffi.UnsignedInt)>>('clang_executeOnThread');
   late final _clang_executeOnThread = _clang_executeOnThreadPtr.asFunction<
       void Function(
           ffi.Pointer<
@@ -4767,8 +4799,8 @@
 
   late final _clang_getCompletionChunkKindPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkKind');
+          ffi.Int32 Function(CXCompletionString,
+              pkg_ffi.UnsignedInt)>>('clang_getCompletionChunkKind');
   late final _clang_getCompletionChunkKind = _clang_getCompletionChunkKindPtr
       .asFunction<int Function(CXCompletionString, int)>();
 
@@ -4786,8 +4818,8 @@
 
   late final _clang_getCompletionChunkTextPtr = _lookup<
       ffi.NativeFunction<
-          CXString Function(
-              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkText');
+          CXString Function(CXCompletionString,
+              pkg_ffi.UnsignedInt)>>('clang_getCompletionChunkText');
   late final _clang_getCompletionChunkText = _clang_getCompletionChunkTextPtr
       .asFunction<CXString Function(CXCompletionString, int)>();
 
@@ -4804,9 +4836,10 @@
   }
 
   late final _clang_getCompletionChunkCompletionStringPtr = _lookup<
-      ffi.NativeFunction<
-          CXCompletionString Function(CXCompletionString,
-              ffi.Uint32)>>('clang_getCompletionChunkCompletionString');
+          ffi.NativeFunction<
+              CXCompletionString Function(
+                  CXCompletionString, pkg_ffi.UnsignedInt)>>(
+      'clang_getCompletionChunkCompletionString');
   late final _clang_getCompletionChunkCompletionString =
       _clang_getCompletionChunkCompletionStringPtr
           .asFunction<CXCompletionString Function(CXCompletionString, int)>();
@@ -4820,9 +4853,9 @@
     );
   }
 
-  late final _clang_getNumCompletionChunksPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
-          'clang_getNumCompletionChunks');
+  late final _clang_getNumCompletionChunksPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCompletionString)>>(
+      'clang_getNumCompletionChunks');
   late final _clang_getNumCompletionChunks = _clang_getNumCompletionChunksPtr
       .asFunction<int Function(CXCompletionString)>();
 
@@ -4835,9 +4868,9 @@
     );
   }
 
-  late final _clang_getCompletionPriorityPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
-          'clang_getCompletionPriority');
+  late final _clang_getCompletionPriorityPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCompletionString)>>(
+      'clang_getCompletionPriority');
   late final _clang_getCompletionPriority = _clang_getCompletionPriorityPtr
       .asFunction<int Function(CXCompletionString)>();
 
@@ -4868,9 +4901,9 @@
     );
   }
 
-  late final _clang_getCompletionNumAnnotationsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
-          'clang_getCompletionNumAnnotations');
+  late final _clang_getCompletionNumAnnotationsPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXCompletionString)>>(
+      'clang_getCompletionNumAnnotations');
   late final _clang_getCompletionNumAnnotations =
       _clang_getCompletionNumAnnotationsPtr
           .asFunction<int Function(CXCompletionString)>();
@@ -4889,7 +4922,7 @@
   late final _clang_getCompletionAnnotationPtr = _lookup<
       ffi.NativeFunction<
           CXString Function(CXCompletionString,
-              ffi.Uint32)>>('clang_getCompletionAnnotation');
+              pkg_ffi.UnsignedInt)>>('clang_getCompletionAnnotation');
   late final _clang_getCompletionAnnotation = _clang_getCompletionAnnotationPtr
       .asFunction<CXString Function(CXCompletionString, int)>();
 
@@ -4959,8 +4992,8 @@
 
   late final _clang_getCompletionNumFixItsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32)>>('clang_getCompletionNumFixIts');
+          pkg_ffi.UnsignedInt Function(ffi.Pointer<CXCodeCompleteResults>,
+              pkg_ffi.UnsignedInt)>>('clang_getCompletionNumFixIts');
   late final _clang_getCompletionNumFixIts = _clang_getCompletionNumFixItsPtr
       .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
 
@@ -4984,8 +5017,8 @@
       ffi.NativeFunction<
           CXString Function(
               ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXSourceRange>)>>('clang_getCompletionFixIt');
   late final _clang_getCompletionFixIt =
       _clang_getCompletionFixItPtr.asFunction<
@@ -4999,7 +5032,7 @@
   }
 
   late final _clang_defaultCodeCompleteOptionsPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function()>>(
           'clang_defaultCodeCompleteOptions');
   late final _clang_defaultCodeCompleteOptions =
       _clang_defaultCodeCompleteOptionsPtr.asFunction<int Function()>();
@@ -5007,7 +5040,7 @@
   /// Perform code completion at a given location in a translation unit.
   ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
     CXTranslationUnit TU,
-    ffi.Pointer<ffi.Int8> complete_filename,
+    ffi.Pointer<pkg_ffi.Char> complete_filename,
     int complete_line,
     int complete_column,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
@@ -5029,16 +5062,16 @@
       ffi.NativeFunction<
           ffi.Pointer<CXCodeCompleteResults> Function(
               CXTranslationUnit,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Uint32,
-              ffi.Uint32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
-              ffi.Uint32)>>('clang_codeCompleteAt');
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>>('clang_codeCompleteAt');
   late final _clang_codeCompleteAt = _clang_codeCompleteAtPtr.asFunction<
       ffi.Pointer<CXCodeCompleteResults> Function(
           CXTranslationUnit,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           int,
           ffi.Pointer<CXUnsavedFile>,
@@ -5059,7 +5092,7 @@
   late final _clang_sortCodeCompletionResultsPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<CXCompletionResult>,
-              ffi.Uint32)>>('clang_sortCodeCompletionResults');
+              pkg_ffi.UnsignedInt)>>('clang_sortCodeCompletionResults');
   late final _clang_sortCodeCompletionResults =
       _clang_sortCodeCompletionResultsPtr
           .asFunction<void Function(ffi.Pointer<CXCompletionResult>, int)>();
@@ -5093,7 +5126,8 @@
 
   late final _clang_codeCompleteGetNumDiagnosticsPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
+              pkg_ffi.UnsignedInt Function(
+                  ffi.Pointer<CXCodeCompleteResults>)>>(
       'clang_codeCompleteGetNumDiagnostics');
   late final _clang_codeCompleteGetNumDiagnostics =
       _clang_codeCompleteGetNumDiagnosticsPtr
@@ -5113,7 +5147,7 @@
   late final _clang_codeCompleteGetDiagnosticPtr = _lookup<
       ffi.NativeFunction<
           CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Uint32)>>('clang_codeCompleteGetDiagnostic');
+              pkg_ffi.UnsignedInt)>>('clang_codeCompleteGetDiagnostic');
   late final _clang_codeCompleteGetDiagnostic =
       _clang_codeCompleteGetDiagnosticPtr.asFunction<
           CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
@@ -5130,7 +5164,8 @@
 
   late final _clang_codeCompleteGetContextsPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Uint64 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
+              pkg_ffi.UnsignedLongLong Function(
+                  ffi.Pointer<CXCodeCompleteResults>)>>(
       'clang_codeCompleteGetContexts');
   late final _clang_codeCompleteGetContexts = _clang_codeCompleteGetContextsPtr
       .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();
@@ -5141,7 +5176,7 @@
   /// there is not a container, this function will return CXCursor_InvalidCode.
   int clang_codeCompleteGetContainerKind(
     ffi.Pointer<CXCodeCompleteResults> Results,
-    ffi.Pointer<ffi.Uint32> IsIncomplete,
+    ffi.Pointer<pkg_ffi.UnsignedInt> IsIncomplete,
   ) {
     return _clang_codeCompleteGetContainerKind(
       Results,
@@ -5150,13 +5185,14 @@
   }
 
   late final _clang_codeCompleteGetContainerKindPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<CXCodeCompleteResults>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_codeCompleteGetContainerKind');
+          ffi.NativeFunction<
+              ffi.Int32 Function(ffi.Pointer<CXCodeCompleteResults>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
+      'clang_codeCompleteGetContainerKind');
   late final _clang_codeCompleteGetContainerKind =
       _clang_codeCompleteGetContainerKindPtr.asFunction<
-          int Function(
-              ffi.Pointer<CXCodeCompleteResults>, ffi.Pointer<ffi.Uint32>)>();
+          int Function(ffi.Pointer<CXCodeCompleteResults>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Returns the USR for the container for the current code completion context.
   /// If there is not a container for the current context, this function will
@@ -5218,7 +5254,7 @@
   }
 
   late final _clang_toggleCrashRecoveryPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Uint32)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(pkg_ffi.UnsignedInt)>>(
           'clang_toggleCrashRecovery');
   late final _clang_toggleCrashRecovery =
       _clang_toggleCrashRecoveryPtr.asFunction<void Function(int)>();
@@ -5288,7 +5324,7 @@
   }
 
   late final _clang_EvalResult_getAsIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(CXEvalResult)>>(
           'clang_EvalResult_getAsInt');
   late final _clang_EvalResult_getAsInt =
       _clang_EvalResult_getAsIntPtr.asFunction<int Function(CXEvalResult)>();
@@ -5305,7 +5341,7 @@
   }
 
   late final _clang_EvalResult_getAsLongLongPtr =
-      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.LongLong Function(CXEvalResult)>>(
           'clang_EvalResult_getAsLongLong');
   late final _clang_EvalResult_getAsLongLong =
       _clang_EvalResult_getAsLongLongPtr
@@ -5322,7 +5358,7 @@
   }
 
   late final _clang_EvalResult_isUnsignedIntPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXEvalResult)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXEvalResult)>>(
           'clang_EvalResult_isUnsignedInt');
   late final _clang_EvalResult_isUnsignedInt =
       _clang_EvalResult_isUnsignedIntPtr
@@ -5338,9 +5374,9 @@
     );
   }
 
-  late final _clang_EvalResult_getAsUnsignedPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXEvalResult)>>(
-          'clang_EvalResult_getAsUnsigned');
+  late final _clang_EvalResult_getAsUnsignedPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.UnsignedLongLong Function(CXEvalResult)>>(
+      'clang_EvalResult_getAsUnsigned');
   late final _clang_EvalResult_getAsUnsigned =
       _clang_EvalResult_getAsUnsignedPtr
           .asFunction<int Function(CXEvalResult)>();
@@ -5364,7 +5400,7 @@
   /// than Int or float. User must not free this pointer, instead call
   /// clang_EvalResult_dispose on the CXEvalResult returned by
   /// clang_Cursor_Evaluate.
-  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+  ffi.Pointer<pkg_ffi.Char> clang_EvalResult_getAsStr(
     CXEvalResult E,
   ) {
     return _clang_EvalResult_getAsStr(
@@ -5372,11 +5408,11 @@
     );
   }
 
-  late final _clang_EvalResult_getAsStrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>>(
-          'clang_EvalResult_getAsStr');
+  late final _clang_EvalResult_getAsStrPtr = _lookup<
+          ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(CXEvalResult)>>(
+      'clang_EvalResult_getAsStr');
   late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(CXEvalResult)>();
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -5395,22 +5431,22 @@
 
   /// Retrieve a remapping.
   CXRemapping clang_getRemappings(
-    ffi.Pointer<ffi.Int8> path,
+    ffi.Pointer<pkg_ffi.Char> path,
   ) {
     return _clang_getRemappings(
       path,
     );
   }
 
-  late final _clang_getRemappingsPtr =
-      _lookup<ffi.NativeFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>>(
-          'clang_getRemappings');
+  late final _clang_getRemappingsPtr = _lookup<
+          ffi.NativeFunction<CXRemapping Function(ffi.Pointer<pkg_ffi.Char>)>>(
+      'clang_getRemappings');
   late final _clang_getRemappings = _clang_getRemappingsPtr
-      .asFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<CXRemapping Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// Retrieve a remapping.
   CXRemapping clang_getRemappingsFromFileList(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> filePaths,
     int numFiles,
   ) {
     return _clang_getRemappingsFromFileList(
@@ -5421,11 +5457,11 @@
 
   late final _clang_getRemappingsFromFileListPtr = _lookup<
       ffi.NativeFunction<
-          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Uint32)>>('clang_getRemappingsFromFileList');
+          CXRemapping Function(ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.UnsignedInt)>>('clang_getRemappingsFromFileList');
   late final _clang_getRemappingsFromFileList =
       _clang_getRemappingsFromFileListPtr.asFunction<
-          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+          CXRemapping Function(ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>, int)>();
 
   /// Determine the number of remappings.
   int clang_remap_getNumFiles(
@@ -5437,7 +5473,7 @@
   }
 
   late final _clang_remap_getNumFilesPtr =
-      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXRemapping)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.UnsignedInt Function(CXRemapping)>>(
           'clang_remap_getNumFiles');
   late final _clang_remap_getNumFiles =
       _clang_remap_getNumFilesPtr.asFunction<int Function(CXRemapping)>();
@@ -5459,7 +5495,10 @@
 
   late final _clang_remap_getFilenamesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(CXRemapping, ffi.Uint32, ffi.Pointer<CXString>,
+          ffi.Void Function(
+              CXRemapping,
+              pkg_ffi.UnsignedInt,
+              ffi.Pointer<CXString>,
               ffi.Pointer<CXString>)>>('clang_remap_getFilenames');
   late final _clang_remap_getFilenames =
       _clang_remap_getFilenamesPtr.asFunction<
@@ -5531,7 +5570,7 @@
   }
 
   late final _clang_index_isEntityObjCContainerKindPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Int32)>>(
           'clang_index_isEntityObjCContainerKind');
   late final _clang_index_isEntityObjCContainerKind =
       _clang_index_isEntityObjCContainerKindPtr.asFunction<int Function(int)>();
@@ -5774,8 +5813,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -5800,19 +5839,19 @@
 
   late final _clang_indexSourceFilePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>,
-              ffi.Uint32)>>('clang_indexSourceFile');
+              pkg_ffi.UnsignedInt)>>('clang_indexSourceFile');
   late final _clang_indexSourceFile = _clang_indexSourceFilePtr.asFunction<
       int Function(
           CXIndexAction,
@@ -5820,8 +5859,8 @@
           ffi.Pointer<IndexerCallbacks>,
           int,
           int,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
           int,
           ffi.Pointer<CXUnsavedFile>,
           int,
@@ -5837,8 +5876,8 @@
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     int index_callbacks_size,
     int index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Pointer<pkg_ffi.Char> source_filename,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> command_line_args,
     int num_command_line_args,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int num_unsaved_files,
@@ -5863,19 +5902,19 @@
 
   late final _clang_indexSourceFileFullArgvPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<CXUnsavedFile>,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<CXTranslationUnit>,
-              ffi.Uint32)>>('clang_indexSourceFileFullArgv');
+              pkg_ffi.UnsignedInt)>>('clang_indexSourceFileFullArgv');
   late final _clang_indexSourceFileFullArgv =
       _clang_indexSourceFileFullArgvPtr.asFunction<
           int Function(
@@ -5884,8 +5923,8 @@
               ffi.Pointer<IndexerCallbacks>,
               int,
               int,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               int,
               ffi.Pointer<CXUnsavedFile>,
               int,
@@ -5914,12 +5953,12 @@
 
   late final _clang_indexTranslationUnitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               CXIndexAction,
               CXClientData,
               ffi.Pointer<IndexerCallbacks>,
-              ffi.Uint32,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt,
               CXTranslationUnit)>>('clang_indexTranslationUnit');
   late final _clang_indexTranslationUnit =
       _clang_indexTranslationUnitPtr.asFunction<
@@ -5932,9 +5971,9 @@
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
-    ffi.Pointer<ffi.Uint32> line,
-    ffi.Pointer<ffi.Uint32> column,
-    ffi.Pointer<ffi.Uint32> offset,
+    ffi.Pointer<pkg_ffi.UnsignedInt> line,
+    ffi.Pointer<pkg_ffi.UnsignedInt> column,
+    ffi.Pointer<pkg_ffi.UnsignedInt> offset,
   ) {
     return _clang_indexLoc_getFileLocation(
       loc,
@@ -5947,23 +5986,24 @@
   }
 
   late final _clang_indexLoc_getFileLocationPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Void Function(
-              CXIdxLoc,
-              ffi.Pointer<CXIdxClientFile>,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>>('clang_indexLoc_getFileLocation');
+          ffi.NativeFunction<
+              ffi.Void Function(
+                  CXIdxLoc,
+                  ffi.Pointer<CXIdxClientFile>,
+                  ffi.Pointer<CXFile>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>,
+                  ffi.Pointer<pkg_ffi.UnsignedInt>)>>(
+      'clang_indexLoc_getFileLocation');
   late final _clang_indexLoc_getFileLocation =
       _clang_indexLoc_getFileLocationPtr.asFunction<
           void Function(
               CXIdxLoc,
               ffi.Pointer<CXIdxClientFile>,
               ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>,
+              ffi.Pointer<pkg_ffi.UnsignedInt>)>();
 
   /// Retrieve the CXSourceLocation represented by the given CXIdxLoc.
   CXSourceLocation clang_indexLoc_getCXSourceLocation(
@@ -5996,7 +6036,7 @@
 
   late final _clang_Type_visitFieldsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Uint32 Function(
+          pkg_ffi.UnsignedInt Function(
               CXType, CXFieldVisitor, CXClientData)>>('clang_Type_visitFields');
   late final _clang_Type_visitFields = _clang_Type_visitFieldsPtr
       .asFunction<int Function(CXType, CXFieldVisitor, CXClientData)>();
@@ -6024,14 +6064,14 @@
 class CXString extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
   external ffi.Pointer<CXString> Strings;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int Count;
 }
 
@@ -6053,13 +6093,13 @@
 /// Provides the contents of a file that has not yet been saved to disk.
 class CXUnsavedFile extends ffi.Struct {
   /// The file whose contents have not yet been saved.
-  external ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<pkg_ffi.Char> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  external ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<pkg_ffi.Char> Contents;
 
   /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
+  @pkg_ffi.UnsignedLong()
   external int Length;
 }
 
@@ -6086,18 +6126,18 @@
 class CXVersion extends ffi.Struct {
   /// The major version number, e.g., the '10' in '10.7.3'. A negative value
   /// indicates that there is no version number at all.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value will be
   /// negative if no minor version number was provided, e.g., for version '10'.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value will be
   /// negative if no minor or subminor version number was provided, e.g., in
   /// version '10' or '10.7'.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Subminor;
 }
 
@@ -6162,7 +6202,7 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Array.multi([3])
-  external ffi.Array<ffi.Uint64> data;
+  external ffi.Array<pkg_ffi.UnsignedLongLong> data;
 }
 
 /// A single translation unit, which resides in an index.
@@ -6173,7 +6213,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -6182,17 +6222,17 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int begin_int_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int end_int_data;
 }
 
 /// Identifies an array of ranges.
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the ranges array.
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int count;
 
   /// An array of CXSourceRanges.
@@ -6388,7 +6428,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Uint64()
+  @pkg_ffi.UnsignedLong()
   external int amount;
 }
 
@@ -6396,7 +6436,7 @@
 class CXTUResourceUsage extends ffi.Struct {
   external ffi.Pointer<ffi.Void> data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numEntries;
 
   external ffi.Pointer<CXTUResourceUsageEntry> entries;
@@ -7063,7 +7103,7 @@
   @ffi.Int32()
   external int kind;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int xdata;
 
   @ffi.Array.multi([3])
@@ -7125,7 +7165,7 @@
   external CXVersion Obsoleted;
 
   /// Whether the entity is unconditionally unavailable on this platform.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int Unavailable;
 
   /// An optional message to provide to a user of this API, e.g., to suggest
@@ -7523,7 +7563,7 @@
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Array.multi([4])
-  external ffi.Array<ffi.Uint32> int_data;
+  external ffi.Array<pkg_ffi.UnsignedInt> int_data;
 
   external ffi.Pointer<ffi.Void> ptr_data;
 }
@@ -7621,7 +7661,7 @@
   external ffi.Pointer<CXCompletionResult> Results;
 
   /// The number of code-completion results stored in the Results array.
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int NumResults;
 }
 
@@ -7746,8 +7786,8 @@
 /// clang_getInclusions()).
 typedef CXInclusionVisitor = ffi.Pointer<
     ffi.NativeFunction<
-        ffi.Void Function(
-            CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;
+        ffi.Void Function(CXFile, ffi.Pointer<CXSourceLocation>,
+            pkg_ffi.UnsignedInt, CXClientData)>>;
 
 abstract class CXEvalResultKind {
   static const int CXEval_Int = 1;
@@ -7796,7 +7836,7 @@
   @ffi.Array.multi([2])
   external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int int_data;
 }
 
@@ -7806,19 +7846,19 @@
   external CXIdxLoc hashLoc;
 
   /// Filename as written in the #include/#import directive.
-  external ffi.Pointer<ffi.Int8> filename;
+  external ffi.Pointer<pkg_ffi.Char> filename;
 
   /// The actual file that the #include/#import directive resolved to.
   external CXFile file;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImport;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isAngled;
 
   /// Non-zero if the directive was automatically turned into a module import.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isModuleImport;
 }
 
@@ -7835,7 +7875,7 @@
 
   /// Non-zero if an inclusion directive was automatically turned into a module
   /// import. Applicable only for modules.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImplicit;
 }
 
@@ -7914,15 +7954,15 @@
   @ffi.Int32()
   external int lang;
 
-  external ffi.Pointer<ffi.Int8> name;
+  external ffi.Pointer<pkg_ffi.Char> name;
 
-  external ffi.Pointer<ffi.Int8> USR;
+  external ffi.Pointer<pkg_ffi.Char> USR;
 
   external CXCursor cursor;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numAttributes;
 }
 
@@ -7957,28 +7997,28 @@
   /// out-of-line C++ member functions.
   external ffi.Pointer<CXIdxContainerInfo> lexicalContainer;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isRedeclaration;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isDefinition;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isContainer;
 
   external ffi.Pointer<CXIdxContainerInfo> declAsContainer;
 
   /// Whether the declaration exists in code or was created implicitly by the
   /// compiler, e.g. implicit Objective-C methods for properties.
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int isImplicit;
 
   external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numAttributes;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int flags;
 }
 
@@ -8014,7 +8054,7 @@
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
   external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numProtocols;
 }
 
@@ -8051,7 +8091,7 @@
 
   external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
-  @ffi.Uint32()
+  @pkg_ffi.UnsignedInt()
   external int numBases;
 }
 
@@ -8109,8 +8149,9 @@
   /// Called periodically to check whether indexing should be aborted. Should
   /// return 0 to continue, and non-zero to abort.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(CXClientData, ffi.Pointer<ffi.Void>)>> abortQuery;
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(CXClientData, ffi.Pointer<ffi.Void>)>>
+      abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
   external ffi.Pointer<
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
index 2980faa..6e13fec 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Bindings to SQLite.
 class SQLite {
@@ -50,59 +51,59 @@
   /// of the hash might be different from [SQLITE_SOURCE_ID].)^
   ///
   /// See also: [sqlite_version()] and [sqlite_source_id()].
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_version =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_version');
+  late final ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> _sqlite3_version =
+      _lookup<ffi.Pointer<pkg_ffi.Char>>('sqlite3_version');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_version => _sqlite3_version.value;
+  ffi.Pointer<pkg_ffi.Char> get sqlite3_version => _sqlite3_version.value;
 
-  set sqlite3_version(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_version(ffi.Pointer<pkg_ffi.Char> value) =>
       _sqlite3_version.value = value;
 
-  ffi.Pointer<ffi.Int8> sqlite3_libversion() {
+  ffi.Pointer<pkg_ffi.Char> sqlite3_libversion() {
     return _sqlite3_libversion();
   }
 
   late final _sqlite3_libversionPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'sqlite3_libversion');
   late final _sqlite3_libversion =
-      _sqlite3_libversionPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _sqlite3_libversionPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_sourceid() {
+  ffi.Pointer<pkg_ffi.Char> sqlite3_sourceid() {
     return _sqlite3_sourceid();
   }
 
   late final _sqlite3_sourceidPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function()>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function()>>(
           'sqlite3_sourceid');
   late final _sqlite3_sourceid =
-      _sqlite3_sourceidPtr.asFunction<ffi.Pointer<ffi.Int8> Function()>();
+      _sqlite3_sourceidPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function()>();
 
   int sqlite3_libversion_number() {
     return _sqlite3_libversion_number();
   }
 
   late final _sqlite3_libversion_numberPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>(
           'sqlite3_libversion_number');
   late final _sqlite3_libversion_number =
       _sqlite3_libversion_numberPtr.asFunction<int Function()>();
 
   int sqlite3_compileoption_used(
-    ffi.Pointer<ffi.Int8> zOptName,
+    ffi.Pointer<pkg_ffi.Char> zOptName,
   ) {
     return _sqlite3_compileoption_used(
       zOptName,
     );
   }
 
-  late final _sqlite3_compileoption_usedPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>(
-          'sqlite3_compileoption_used');
+  late final _sqlite3_compileoption_usedPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>)>>(
+      'sqlite3_compileoption_used');
   late final _sqlite3_compileoption_used = _sqlite3_compileoption_usedPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_compileoption_get(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_compileoption_get(
     int N,
   ) {
     return _sqlite3_compileoption_get(
@@ -110,11 +111,11 @@
     );
   }
 
-  late final _sqlite3_compileoption_getPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
-          'sqlite3_compileoption_get');
+  late final _sqlite3_compileoption_getPtr = _lookup<
+          ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(pkg_ffi.Int)>>(
+      'sqlite3_compileoption_get');
   late final _sqlite3_compileoption_get = _sqlite3_compileoption_getPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(int)>();
 
   /// CAPI3REF: Test To See If The Library Is Threadsafe
   ///
@@ -155,7 +156,7 @@
   }
 
   late final _sqlite3_threadsafePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_threadsafe');
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>('sqlite3_threadsafe');
   late final _sqlite3_threadsafe =
       _sqlite3_threadsafePtr.asFunction<int Function()>();
 
@@ -204,7 +205,7 @@
   }
 
   late final _sqlite3_closePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_close');
   late final _sqlite3_close =
       _sqlite3_closePtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -218,7 +219,7 @@
   }
 
   late final _sqlite3_close_v2Ptr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_close_v2');
   late final _sqlite3_close_v2 =
       _sqlite3_close_v2Ptr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -285,17 +286,17 @@
   /// </ul>
   int sqlite3_exec(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> sql,
+    ffi.Pointer<pkg_ffi.Char> sql,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
+                pkg_ffi.Int Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                    ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>
+                    pkg_ffi.Int,
+                    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>
         callback,
     ffi.Pointer<ffi.Void> arg3,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> errmsg,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> errmsg,
   ) {
     return _sqlite3_exec(
       arg0,
@@ -308,31 +309,31 @@
 
   late final _sqlite3_execPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>,
+                          pkg_ffi.Int,
+                          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_exec');
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_exec');
   late final _sqlite3_exec = _sqlite3_execPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  pkg_ffi.Int Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-                      ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>,
+                      pkg_ffi.Int,
+                      ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+                      ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   /// CAPI3REF: Initialize The SQLite Library
   ///
@@ -412,7 +413,7 @@
   }
 
   late final _sqlite3_initializePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_initialize');
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>('sqlite3_initialize');
   late final _sqlite3_initialize =
       _sqlite3_initializePtr.asFunction<int Function()>();
 
@@ -421,7 +422,7 @@
   }
 
   late final _sqlite3_shutdownPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_shutdown');
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>('sqlite3_shutdown');
   late final _sqlite3_shutdown =
       _sqlite3_shutdownPtr.asFunction<int Function()>();
 
@@ -430,7 +431,7 @@
   }
 
   late final _sqlite3_os_initPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_os_init');
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>('sqlite3_os_init');
   late final _sqlite3_os_init =
       _sqlite3_os_initPtr.asFunction<int Function()>();
 
@@ -439,7 +440,7 @@
   }
 
   late final _sqlite3_os_endPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>('sqlite3_os_end');
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>('sqlite3_os_end');
   late final _sqlite3_os_end = _sqlite3_os_endPtr.asFunction<int Function()>();
 
   /// CAPI3REF: Configuring The SQLite Library
@@ -480,7 +481,7 @@
   }
 
   late final _sqlite3_configPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>(
           'sqlite3_config');
   late final _sqlite3_config =
       _sqlite3_configPtr.asFunction<int Function(int)>();
@@ -512,8 +513,8 @@
 
   late final _sqlite3_db_configPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_db_config');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3>, pkg_ffi.Int)>>('sqlite3_db_config');
   late final _sqlite3_db_config = _sqlite3_db_configPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -535,8 +536,8 @@
 
   late final _sqlite3_extended_result_codesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Int32)>>('sqlite3_extended_result_codes');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              pkg_ffi.Int)>>('sqlite3_extended_result_codes');
   late final _sqlite3_extended_result_codes = _sqlite3_extended_result_codesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -698,7 +699,7 @@
   }
 
   late final _sqlite3_changesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_changes');
   late final _sqlite3_changes =
       _sqlite3_changesPtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -745,7 +746,7 @@
   }
 
   late final _sqlite3_total_changesPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_total_changes');
   late final _sqlite3_total_changes = _sqlite3_total_changesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -829,18 +830,18 @@
   /// The input to [sqlite3_complete16()] must be a zero-terminated
   /// UTF-16 string in native byte order.
   int sqlite3_complete(
-    ffi.Pointer<ffi.Int8> sql,
+    ffi.Pointer<pkg_ffi.Char> sql,
   ) {
     return _sqlite3_complete(
       sql,
     );
   }
 
-  late final _sqlite3_completePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>(
-          'sqlite3_complete');
-  late final _sqlite3_complete =
-      _sqlite3_completePtr.asFunction<int Function(ffi.Pointer<ffi.Int8>)>();
+  late final _sqlite3_completePtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>)>>(
+      'sqlite3_complete');
+  late final _sqlite3_complete = _sqlite3_completePtr
+      .asFunction<int Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_complete16(
     ffi.Pointer<ffi.Void> sql,
@@ -851,7 +852,7 @@
   }
 
   late final _sqlite3_complete16Ptr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>(
           'sqlite3_complete16');
   late final _sqlite3_complete16 =
       _sqlite3_complete16Ptr.asFunction<int Function(ffi.Pointer<ffi.Void>)>();
@@ -917,7 +918,7 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>
+                pkg_ffi.Int Function(ffi.Pointer<ffi.Void>, pkg_ffi.Int)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -930,18 +931,19 @@
 
   late final _sqlite3_busy_handlerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>,
+                      pkg_ffi.Int Function(
+                          ffi.Pointer<ffi.Void>, pkg_ffi.Int)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_busy_handler');
   late final _sqlite3_busy_handler = _sqlite3_busy_handlerPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>,
+                  pkg_ffi.Int Function(ffi.Pointer<ffi.Void>, pkg_ffi.Int)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Set A Busy Timeout
@@ -975,8 +977,8 @@
 
   late final _sqlite3_busy_timeoutPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_busy_timeout');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3>, pkg_ffi.Int)>>('sqlite3_busy_timeout');
   late final _sqlite3_busy_timeout = _sqlite3_busy_timeoutPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -1053,11 +1055,11 @@
   /// [sqlite3_errmsg()].
   int sqlite3_get_table(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
-    ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> pazResult,
-    ffi.Pointer<ffi.Int32> pnRow,
-    ffi.Pointer<ffi.Int32> pnColumn,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrmsg,
+    ffi.Pointer<pkg_ffi.Char> zSql,
+    ffi.Pointer<ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>> pazResult,
+    ffi.Pointer<pkg_ffi.Int> pnRow,
+    ffi.Pointer<pkg_ffi.Int> pnColumn,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzErrmsg,
   ) {
     return _sqlite3_get_table(
       db,
@@ -1071,24 +1073,24 @@
 
   late final _sqlite3_get_tablePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_get_table');
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_get_table');
   late final _sqlite3_get_table = _sqlite3_get_tablePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>>,
-          ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>>,
+          ffi.Pointer<pkg_ffi.Int>,
+          ffi.Pointer<pkg_ffi.Int>,
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   void sqlite3_free_table(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> result,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> result,
   ) {
     return _sqlite3_free_table(
       result,
@@ -1098,9 +1100,9 @@
   late final _sqlite3_free_tablePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_free_table');
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_free_table');
   late final _sqlite3_free_table = _sqlite3_free_tablePtr
-      .asFunction<void Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      .asFunction<void Function(ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   /// CAPI3REF: Formatted String Printing Functions
   ///
@@ -1140,8 +1142,8 @@
   /// ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
   ///
   /// See also:  [built-in printf()], [printf() SQL function]
-  ffi.Pointer<ffi.Int8> sqlite3_mprintf(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_mprintf(
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_mprintf(
       arg0,
@@ -1150,15 +1152,15 @@
 
   late final _sqlite3_mprintfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_mprintf');
-  late final _sqlite3_mprintf = _sqlite3_mprintfPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_mprintf');
+  late final _sqlite3_mprintf = _sqlite3_mprintfPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_snprintf(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_snprintf(
     int arg0,
-    ffi.Pointer<ffi.Int8> arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<pkg_ffi.Char> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg2,
   ) {
     return _sqlite3_snprintf(
       arg0,
@@ -1169,11 +1171,13 @@
 
   late final _sqlite3_snprintfPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Int32, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_snprintf');
+          ffi.Pointer<pkg_ffi.Char> Function(
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_snprintf');
   late final _sqlite3_snprintf = _sqlite3_snprintfPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          int, ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<pkg_ffi.Char> Function(
+          int, ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Memory Allocation Subsystem
   ///
@@ -1257,7 +1261,7 @@
   }
 
   late final _sqlite3_mallocPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Int)>>(
           'sqlite3_malloc');
   late final _sqlite3_malloc =
       _sqlite3_mallocPtr.asFunction<ffi.Pointer<ffi.Void> Function(int)>();
@@ -1289,7 +1293,7 @@
   late final _sqlite3_reallocPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<ffi.Void>, ffi.Int32)>>('sqlite3_realloc');
+              ffi.Pointer<ffi.Void>, pkg_ffi.Int)>>('sqlite3_realloc');
   late final _sqlite3_realloc = _sqlite3_reallocPtr
       .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, int)>();
 
@@ -1378,7 +1382,7 @@
   }
 
   late final _sqlite3_memory_highwaterPtr =
-      _lookup<ffi.NativeFunction<sqlite3_int64 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<sqlite3_int64 Function(pkg_ffi.Int)>>(
           'sqlite3_memory_highwater');
   late final _sqlite3_memory_highwater =
       _sqlite3_memory_highwaterPtr.asFunction<int Function(int)>();
@@ -1415,7 +1419,7 @@
   late final _sqlite3_randomnessPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(
-              ffi.Int32, ffi.Pointer<ffi.Void>)>>('sqlite3_randomness');
+              pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>('sqlite3_randomness');
   late final _sqlite3_randomness = _sqlite3_randomnessPtr
       .asFunction<void Function(int, ffi.Pointer<ffi.Void>)>();
 
@@ -1510,13 +1514,13 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
+                pkg_ffi.Int Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>)>>
+                    pkg_ffi.Int,
+                    ffi.Pointer<pkg_ffi.Char>,
+                    ffi.Pointer<pkg_ffi.Char>,
+                    ffi.Pointer<pkg_ffi.Char>,
+                    ffi.Pointer<pkg_ffi.Char>)>>
         xAuth,
     ffi.Pointer<ffi.Void> pUserData,
   ) {
@@ -1529,30 +1533,30 @@
 
   late final _sqlite3_set_authorizerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>)>>,
+                          pkg_ffi.Int,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          ffi.Pointer<pkg_ffi.Char>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_set_authorizer');
   late final _sqlite3_set_authorizer = _sqlite3_set_authorizerPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(
+                  pkg_ffi.Int Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>)>>,
+                      pkg_ffi.Int,
+                      ffi.Pointer<pkg_ffi.Char>,
+                      ffi.Pointer<pkg_ffi.Char>,
+                      ffi.Pointer<pkg_ffi.Char>,
+                      ffi.Pointer<pkg_ffi.Char>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Tracing And Profiling Functions
@@ -1590,7 +1594,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>
+                    ffi.Pointer<ffi.Void>, ffi.Pointer<pkg_ffi.Char>)>>
         xTrace,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -1608,7 +1612,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>,
+                          ffi.Pointer<ffi.Void>, ffi.Pointer<pkg_ffi.Char>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_trace');
   late final _sqlite3_trace = _sqlite3_tracePtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
@@ -1616,15 +1620,15 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>)>>,
+                      ffi.Pointer<ffi.Void>, ffi.Pointer<pkg_ffi.Char>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_profile(
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int8>,
-                    sqlite3_uint64)>>
+                ffi.Void Function(ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<pkg_ffi.Char>, sqlite3_uint64)>>
         xProfile,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -1642,7 +1646,7 @@
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(ffi.Pointer<ffi.Void>,
-                          ffi.Pointer<ffi.Int8>, sqlite3_uint64)>>,
+                          ffi.Pointer<pkg_ffi.Char>, sqlite3_uint64)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_profile');
   late final _sqlite3_profile = _sqlite3_profilePtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
@@ -1650,7 +1654,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<ffi.Int8>, sqlite3_uint64)>>,
+                      ffi.Pointer<pkg_ffi.Char>, sqlite3_uint64)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: SQL Trace Hook
@@ -1685,7 +1689,7 @@
     int uMask,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
+                pkg_ffi.Int Function(pkg_ffi.UnsignedInt, ffi.Pointer<ffi.Void>,
                     ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>
         xCallback,
     ffi.Pointer<ffi.Void> pCtx,
@@ -1700,13 +1704,16 @@
 
   late final _sqlite3_trace_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Uint32,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
-                          ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>,
+                      pkg_ffi.Int Function(
+                          pkg_ffi.UnsignedInt,
+                          ffi.Pointer<ffi.Void>,
+                          ffi.Pointer<ffi.Void>,
+                          ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_trace_v2');
   late final _sqlite3_trace_v2 = _sqlite3_trace_v2Ptr.asFunction<
       int Function(
@@ -1714,8 +1721,11 @@
           int,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Uint32, ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>,
+                  pkg_ffi.Int Function(
+                      pkg_ffi.UnsignedInt,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<ffi.Void>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Query Progress Callbacks
@@ -1750,7 +1760,7 @@
   void sqlite3_progress_handler(
     ffi.Pointer<sqlite3> arg0,
     int arg1,
-    ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>
+    ffi.Pointer<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>
         arg2,
     ffi.Pointer<ffi.Void> arg3,
   ) {
@@ -1766,10 +1776,10 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                      pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_progress_handler');
   late final _sqlite3_progress_handler =
       _sqlite3_progress_handlerPtr.asFunction<
@@ -1778,7 +1788,7 @@
               int,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                      pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Opening A New Database Connection
@@ -2033,7 +2043,7 @@
   ///
   /// See also: [sqlite3_temp_directory]
   int sqlite3_open(
-    ffi.Pointer<ffi.Int8> filename,
+    ffi.Pointer<pkg_ffi.Char> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
   ) {
     return _sqlite3_open(
@@ -2044,10 +2054,11 @@
 
   late final _sqlite3_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<ffi.Pointer<sqlite3>>)>>('sqlite3_open');
   late final _sqlite3_open = _sqlite3_openPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
+      int Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
 
   int sqlite3_open16(
     ffi.Pointer<ffi.Void> filename,
@@ -2061,16 +2072,16 @@
 
   late final _sqlite3_open16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Void>,
+          pkg_ffi.Int Function(ffi.Pointer<ffi.Void>,
               ffi.Pointer<ffi.Pointer<sqlite3>>)>>('sqlite3_open16');
   late final _sqlite3_open16 = _sqlite3_open16Ptr.asFunction<
       int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Pointer<sqlite3>>)>();
 
   int sqlite3_open_v2(
-    ffi.Pointer<ffi.Int8> filename,
+    ffi.Pointer<pkg_ffi.Char> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
     int flags,
-    ffi.Pointer<ffi.Int8> zVfs,
+    ffi.Pointer<pkg_ffi.Char> zVfs,
   ) {
     return _sqlite3_open_v2(
       filename,
@@ -2082,14 +2093,14 @@
 
   late final _sqlite3_open_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<ffi.Int8>,
+          pkg_ffi.Int Function(
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<ffi.Pointer<sqlite3>>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_open_v2');
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_open_v2');
   late final _sqlite3_open_v2 = _sqlite3_open_v2Ptr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<sqlite3>>,
-          int, ffi.Pointer<ffi.Int8>)>();
+      int Function(ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<ffi.Pointer<sqlite3>>,
+          int, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Obtain Values For URI Parameters
   ///
@@ -2155,9 +2166,9 @@
   /// main database file.
   ///
   /// See the [URI filename] documentation for additional information.
-  ffi.Pointer<ffi.Int8> sqlite3_uri_parameter(
-    ffi.Pointer<ffi.Int8> zFilename,
-    ffi.Pointer<ffi.Int8> zParam,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_uri_parameter(
+    ffi.Pointer<pkg_ffi.Char> zFilename,
+    ffi.Pointer<pkg_ffi.Char> zParam,
   ) {
     return _sqlite3_uri_parameter(
       zFilename,
@@ -2167,15 +2178,15 @@
 
   late final _sqlite3_uri_parameterPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_uri_parameter');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_uri_parameter');
   late final _sqlite3_uri_parameter = _sqlite3_uri_parameterPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<pkg_ffi.Char> Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_uri_boolean(
-    ffi.Pointer<ffi.Int8> zFile,
-    ffi.Pointer<ffi.Int8> zParam,
+    ffi.Pointer<pkg_ffi.Char> zFile,
+    ffi.Pointer<pkg_ffi.Char> zParam,
     int bDefault,
   ) {
     return _sqlite3_uri_boolean(
@@ -2187,14 +2198,15 @@
 
   late final _sqlite3_uri_booleanPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_uri_boolean');
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>, pkg_ffi.Int)>>('sqlite3_uri_boolean');
   late final _sqlite3_uri_boolean = _sqlite3_uri_booleanPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   int sqlite3_uri_int64(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_uri_int64(
@@ -2206,13 +2218,14 @@
 
   late final _sqlite3_uri_int64Ptr = _lookup<
       ffi.NativeFunction<
-          sqlite3_int64 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              sqlite3_int64)>>('sqlite3_uri_int64');
+          sqlite3_int64 Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>, sqlite3_int64)>>('sqlite3_uri_int64');
   late final _sqlite3_uri_int64 = _sqlite3_uri_int64Ptr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_uri_key(
-    ffi.Pointer<ffi.Int8> zFilename,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_uri_key(
+    ffi.Pointer<pkg_ffi.Char> zFilename,
     int N,
   ) {
     return _sqlite3_uri_key(
@@ -2223,10 +2236,10 @@
 
   late final _sqlite3_uri_keyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>, ffi.Int32)>>('sqlite3_uri_key');
-  late final _sqlite3_uri_key = _sqlite3_uri_keyPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<pkg_ffi.Char>, pkg_ffi.Int)>>('sqlite3_uri_key');
+  late final _sqlite3_uri_key = _sqlite3_uri_keyPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// CAPI3REF:  Translate filenames
   ///
@@ -2253,8 +2266,8 @@
   /// filename passed into the VFS from the SQLite core and F is not the
   /// return value from [sqlite3_db_filename()], then the result is
   /// undefined and is likely a memory access violation.
-  ffi.Pointer<ffi.Int8> sqlite3_filename_database(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_filename_database(
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_filename_database(
       arg0,
@@ -2263,13 +2276,14 @@
 
   late final _sqlite3_filename_databasePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_database');
-  late final _sqlite3_filename_database = _sqlite3_filename_databasePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_filename_database');
+  late final _sqlite3_filename_database =
+      _sqlite3_filename_databasePtr.asFunction<
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_filename_journal(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_filename_journal(
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_filename_journal(
       arg0,
@@ -2278,13 +2292,14 @@
 
   late final _sqlite3_filename_journalPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_journal');
-  late final _sqlite3_filename_journal = _sqlite3_filename_journalPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_filename_journal');
+  late final _sqlite3_filename_journal =
+      _sqlite3_filename_journalPtr.asFunction<
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_filename_wal(
-    ffi.Pointer<ffi.Int8> arg0,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_filename_wal(
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_filename_wal(
       arg0,
@@ -2293,10 +2308,10 @@
 
   late final _sqlite3_filename_walPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_filename_wal');
-  late final _sqlite3_filename_wal = _sqlite3_filename_walPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_filename_wal');
+  late final _sqlite3_filename_wal = _sqlite3_filename_walPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF:  Database File Corresponding To A Journal
   ///
@@ -2314,7 +2329,7 @@
   /// of this routine results in undefined and probably undesirable
   /// behavior.
   ffi.Pointer<sqlite3_file> sqlite3_database_file_object(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_database_file_object(
       arg0,
@@ -2324,9 +2339,10 @@
   late final _sqlite3_database_file_objectPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_file> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_database_file_object');
-  late final _sqlite3_database_file_object = _sqlite3_database_file_objectPtr
-      .asFunction<ffi.Pointer<sqlite3_file> Function(ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_database_file_object');
+  late final _sqlite3_database_file_object =
+      _sqlite3_database_file_objectPtr.asFunction<
+          ffi.Pointer<sqlite3_file> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Create and Destroy VFS Filenames
   ///
@@ -2371,12 +2387,12 @@
   /// that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y,
   /// then the corresponding [sqlite3_module.xClose() method should also be
   /// invoked prior to calling sqlite3_free_filename(Y).
-  ffi.Pointer<ffi.Int8> sqlite3_create_filename(
-    ffi.Pointer<ffi.Int8> zDatabase,
-    ffi.Pointer<ffi.Int8> zJournal,
-    ffi.Pointer<ffi.Int8> zWal,
+  ffi.Pointer<pkg_ffi.Char> sqlite3_create_filename(
+    ffi.Pointer<pkg_ffi.Char> zDatabase,
+    ffi.Pointer<pkg_ffi.Char> zJournal,
+    ffi.Pointer<pkg_ffi.Char> zWal,
     int nParam,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> azParam,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> azParam,
   ) {
     return _sqlite3_create_filename(
       zDatabase,
@@ -2388,23 +2404,24 @@
   }
 
   late final _sqlite3_create_filenamePtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_create_filename');
+          ffi.NativeFunction<
+              ffi.Pointer<pkg_ffi.Char> Function(
+                  ffi.Pointer<pkg_ffi.Char>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>(
+      'sqlite3_create_filename');
   late final _sqlite3_create_filename = _sqlite3_create_filenamePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
+      ffi.Pointer<pkg_ffi.Char> Function(
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   void sqlite3_free_filename(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg0,
   ) {
     return _sqlite3_free_filename(
       arg0,
@@ -2412,10 +2429,10 @@
   }
 
   late final _sqlite3_free_filenamePtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Int8>)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<pkg_ffi.Char>)>>(
           'sqlite3_free_filename');
   late final _sqlite3_free_filename = _sqlite3_free_filenamePtr
-      .asFunction<void Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<void Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Error Codes And Messages
   /// METHOD: sqlite3
@@ -2476,7 +2493,7 @@
   }
 
   late final _sqlite3_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_errcode');
   late final _sqlite3_errcode =
       _sqlite3_errcodePtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -2490,12 +2507,12 @@
   }
 
   late final _sqlite3_extended_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_extended_errcode');
   late final _sqlite3_extended_errcode = _sqlite3_extended_errcodePtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_errmsg(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_errmsg(
     ffi.Pointer<sqlite3> arg0,
   ) {
     return _sqlite3_errmsg(
@@ -2505,10 +2522,10 @@
 
   late final _sqlite3_errmsgPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3>)>>('sqlite3_errmsg');
   late final _sqlite3_errmsg = _sqlite3_errmsgPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3>)>();
+      .asFunction<ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_errmsg16(
     ffi.Pointer<sqlite3> arg0,
@@ -2525,7 +2542,7 @@
   late final _sqlite3_errmsg16 = _sqlite3_errmsg16Ptr
       .asFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_errstr(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_errstr(
     int arg0,
   ) {
     return _sqlite3_errstr(
@@ -2533,11 +2550,11 @@
     );
   }
 
-  late final _sqlite3_errstrPtr =
-      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
-          'sqlite3_errstr');
+  late final _sqlite3_errstrPtr = _lookup<
+          ffi.NativeFunction<ffi.Pointer<pkg_ffi.Char> Function(pkg_ffi.Int)>>(
+      'sqlite3_errstr');
   late final _sqlite3_errstr =
-      _sqlite3_errstrPtr.asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      _sqlite3_errstrPtr.asFunction<ffi.Pointer<pkg_ffi.Char> Function(int)>();
 
   /// CAPI3REF: Run-time Limits
   /// METHOD: sqlite3
@@ -2591,8 +2608,8 @@
 
   late final _sqlite3_limitPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32, ffi.Int32)>>('sqlite3_limit');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>, pkg_ffi.Int,
+              pkg_ffi.Int)>>('sqlite3_limit');
   late final _sqlite3_limit = _sqlite3_limitPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int, int)>();
 
@@ -2696,10 +2713,10 @@
   /// sqlite3_prepare_v3() with a zero prepFlags parameter.
   int sqlite3_prepare(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<pkg_ffi.Char> zSql,
     int nByte,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare(
       db,
@@ -2712,26 +2729,26 @@
 
   late final _sqlite3_preparePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare');
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_prepare');
   late final _sqlite3_prepare = _sqlite3_preparePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   int sqlite3_prepare_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<pkg_ffi.Char> zSql,
     int nByte,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare_v2(
       db,
@@ -2744,27 +2761,27 @@
 
   late final _sqlite3_prepare_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare_v2');
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_prepare_v2');
   late final _sqlite3_prepare_v2 = _sqlite3_prepare_v2Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   int sqlite3_prepare_v3(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSql,
+    ffi.Pointer<pkg_ffi.Char> zSql,
     int nByte,
     int prepFlags,
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzTail,
   ) {
     return _sqlite3_prepare_v3(
       db,
@@ -2778,21 +2795,21 @@
 
   late final _sqlite3_prepare_v3Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Uint32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_prepare_v3');
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_prepare_v3');
   late final _sqlite3_prepare_v3 = _sqlite3_prepare_v3Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+          ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   int sqlite3_prepare16(
     ffi.Pointer<sqlite3> db,
@@ -2812,10 +2829,10 @@
 
   late final _sqlite3_prepare16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16');
   late final _sqlite3_prepare16 = _sqlite3_prepare16Ptr.asFunction<
@@ -2844,10 +2861,10 @@
 
   late final _sqlite3_prepare16_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16_v2');
   late final _sqlite3_prepare16_v2 = _sqlite3_prepare16_v2Ptr.asFunction<
@@ -2878,11 +2895,11 @@
 
   late final _sqlite3_prepare16_v3Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Uint32,
+              pkg_ffi.Int,
+              pkg_ffi.UnsignedInt,
               ffi.Pointer<ffi.Pointer<sqlite3_stmt>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>>('sqlite3_prepare16_v3');
   late final _sqlite3_prepare16_v3 = _sqlite3_prepare16_v3Ptr.asFunction<
@@ -2930,7 +2947,7 @@
   /// ^The string returned by sqlite3_expanded_sql(P), on the other hand,
   /// is obtained from [sqlite3_malloc()] and must be free by the application
   /// by passing it to [sqlite3_free()].
-  ffi.Pointer<ffi.Int8> sqlite3_sql(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_sql(
@@ -2940,12 +2957,12 @@
 
   late final _sqlite3_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_sql');
-  late final _sqlite3_sql = _sqlite3_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+  late final _sqlite3_sql = _sqlite3_sqlPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_expanded_sql(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_expanded_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_expanded_sql(
@@ -2955,12 +2972,12 @@
 
   late final _sqlite3_expanded_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_expanded_sql');
-  late final _sqlite3_expanded_sql = _sqlite3_expanded_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+  late final _sqlite3_expanded_sql = _sqlite3_expanded_sqlPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_normalized_sql(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_normalized_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
     return _sqlite3_normalized_sql(
@@ -2970,10 +2987,10 @@
 
   late final _sqlite3_normalized_sqlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_normalized_sql');
-  late final _sqlite3_normalized_sql = _sqlite3_normalized_sqlPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>)>();
+  late final _sqlite3_normalized_sql = _sqlite3_normalized_sqlPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>)>();
 
   /// CAPI3REF: Determine If An SQL Statement Writes The Database
   /// METHOD: sqlite3_stmt
@@ -3016,7 +3033,7 @@
   }
 
   late final _sqlite3_stmt_readonlyPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_stmt_readonly');
   late final _sqlite3_stmt_readonly = _sqlite3_stmt_readonlyPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3038,7 +3055,7 @@
   }
 
   late final _sqlite3_stmt_isexplainPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_stmt_isexplain');
   late final _sqlite3_stmt_isexplain = _sqlite3_stmt_isexplainPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3069,7 +3086,7 @@
   }
 
   late final _sqlite3_stmt_busyPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_stmt_busy');
   late final _sqlite3_stmt_busy = _sqlite3_stmt_busyPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3227,11 +3244,11 @@
 
   late final _sqlite3_bind_blobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3264,9 +3281,9 @@
 
   late final _sqlite3_bind_blob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
               sqlite3_uint64,
               ffi.Pointer<
@@ -3296,7 +3313,7 @@
 
   late final _sqlite3_bind_doublePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
               ffi.Double)>>('sqlite3_bind_double');
   late final _sqlite3_bind_double = _sqlite3_bind_doublePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, double)>();
@@ -3315,8 +3332,8 @@
 
   late final _sqlite3_bind_intPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_bind_int');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
+              pkg_ffi.Int)>>('sqlite3_bind_int');
   late final _sqlite3_bind_int = _sqlite3_bind_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -3334,7 +3351,7 @@
 
   late final _sqlite3_bind_int64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
               sqlite3_int64)>>('sqlite3_bind_int64');
   late final _sqlite3_bind_int64 = _sqlite3_bind_int64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
@@ -3351,15 +3368,15 @@
 
   late final _sqlite3_bind_nullPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_bind_null');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_bind_null');
   late final _sqlite3_bind_null = _sqlite3_bind_nullPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   int sqlite3_bind_text(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<pkg_ffi.Char> arg2,
     int arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
@@ -3375,11 +3392,11 @@
 
   late final _sqlite3_bind_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3388,7 +3405,7 @@
       int Function(
           ffi.Pointer<sqlite3_stmt>,
           int,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
@@ -3412,11 +3429,11 @@
 
   late final _sqlite3_bind_text16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3433,7 +3450,7 @@
   int sqlite3_bind_text64(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<pkg_ffi.Char> arg2,
     int arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
@@ -3451,19 +3468,19 @@
 
   late final _sqlite3_bind_text64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
               sqlite3_uint64,
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
-              ffi.Uint8)>>('sqlite3_bind_text64');
+              pkg_ffi.UnsignedChar)>>('sqlite3_bind_text64');
   late final _sqlite3_bind_text64 = _sqlite3_bind_text64Ptr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_stmt>,
           int,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
@@ -3483,7 +3500,7 @@
 
   late final _sqlite3_bind_valuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
               ffi.Pointer<sqlite3_value>)>>('sqlite3_bind_value');
   late final _sqlite3_bind_value = _sqlite3_bind_valuePtr.asFunction<
       int Function(
@@ -3493,7 +3510,7 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     ffi.Pointer<ffi.Void> arg2,
-    ffi.Pointer<ffi.Int8> arg3,
+    ffi.Pointer<pkg_ffi.Char> arg3,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg4,
   ) {
@@ -3508,11 +3525,11 @@
 
   late final _sqlite3_bind_pointerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -3522,7 +3539,7 @@
           ffi.Pointer<sqlite3_stmt>,
           int,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
@@ -3540,8 +3557,8 @@
 
   late final _sqlite3_bind_zeroblobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_bind_zeroblob');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
+              pkg_ffi.Int)>>('sqlite3_bind_zeroblob');
   late final _sqlite3_bind_zeroblob = _sqlite3_bind_zeroblobPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -3559,7 +3576,7 @@
 
   late final _sqlite3_bind_zeroblob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
               sqlite3_uint64)>>('sqlite3_bind_zeroblob64');
   late final _sqlite3_bind_zeroblob64 = _sqlite3_bind_zeroblob64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
@@ -3590,7 +3607,7 @@
   }
 
   late final _sqlite3_bind_parameter_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_bind_parameter_count');
   late final _sqlite3_bind_parameter_count = _sqlite3_bind_parameter_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3619,7 +3636,7 @@
   /// See also: [sqlite3_bind_blob|sqlite3_bind()],
   /// [sqlite3_bind_parameter_count()], and
   /// [sqlite3_bind_parameter_index()].
-  ffi.Pointer<ffi.Int8> sqlite3_bind_parameter_name(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_bind_parameter_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3631,11 +3648,11 @@
 
   late final _sqlite3_bind_parameter_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_bind_parameter_name');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_bind_parameter_name');
   late final _sqlite3_bind_parameter_name =
       _sqlite3_bind_parameter_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   /// CAPI3REF: Index Of A Parameter With A Given Name
   /// METHOD: sqlite3_stmt
@@ -3653,7 +3670,7 @@
   /// [sqlite3_bind_parameter_name()].
   int sqlite3_bind_parameter_index(
     ffi.Pointer<sqlite3_stmt> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<pkg_ffi.Char> zName,
   ) {
     return _sqlite3_bind_parameter_index(
       arg0,
@@ -3663,11 +3680,11 @@
 
   late final _sqlite3_bind_parameter_indexPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_bind_parameter_index');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_bind_parameter_index');
   late final _sqlite3_bind_parameter_index =
       _sqlite3_bind_parameter_indexPtr.asFunction<
-          int Function(ffi.Pointer<sqlite3_stmt>, ffi.Pointer<ffi.Int8>)>();
+          int Function(ffi.Pointer<sqlite3_stmt>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Reset All Bindings On A Prepared Statement
   /// METHOD: sqlite3_stmt
@@ -3684,7 +3701,7 @@
   }
 
   late final _sqlite3_clear_bindingsPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_clear_bindings');
   late final _sqlite3_clear_bindings = _sqlite3_clear_bindingsPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3710,7 +3727,7 @@
   }
 
   late final _sqlite3_column_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_column_count');
   late final _sqlite3_column_count = _sqlite3_column_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -3740,7 +3757,7 @@
   /// that column, if there is an AS clause.  If there is no AS clause
   /// then the name of the column is unspecified and may change from
   /// one release of SQLite to the next.
-  ffi.Pointer<ffi.Int8> sqlite3_column_name(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_column_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int N,
   ) {
@@ -3752,10 +3769,10 @@
 
   late final _sqlite3_column_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_name');
+          ffi.Pointer<pkg_ffi.Char> Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_name');
   late final _sqlite3_column_name = _sqlite3_column_namePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3769,8 +3786,8 @@
 
   late final _sqlite3_column_name16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_name16');
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_name16');
   late final _sqlite3_column_name16 = _sqlite3_column_name16Ptr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -3814,7 +3831,7 @@
   /// [sqlite3_column_database_name | column metadata interfaces]
   /// for the same [prepared statement] and result column
   /// at the same time then the results are undefined.
-  ffi.Pointer<ffi.Int8> sqlite3_column_database_name(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_column_database_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3826,11 +3843,11 @@
 
   late final _sqlite3_column_database_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_database_name');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_database_name');
   late final _sqlite3_column_database_name =
       _sqlite3_column_database_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_database_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3845,12 +3862,12 @@
   late final _sqlite3_column_database_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_database_name16');
+              pkg_ffi.Int)>>('sqlite3_column_database_name16');
   late final _sqlite3_column_database_name16 =
       _sqlite3_column_database_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_column_table_name(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_column_table_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3862,11 +3879,11 @@
 
   late final _sqlite3_column_table_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_table_name');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_table_name');
   late final _sqlite3_column_table_name =
       _sqlite3_column_table_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_table_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3881,12 +3898,12 @@
   late final _sqlite3_column_table_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_table_name16');
+              pkg_ffi.Int)>>('sqlite3_column_table_name16');
   late final _sqlite3_column_table_name16 =
       _sqlite3_column_table_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_column_origin_name(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_column_origin_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3898,11 +3915,11 @@
 
   late final _sqlite3_column_origin_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_origin_name');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_origin_name');
   late final _sqlite3_column_origin_name =
       _sqlite3_column_origin_namePtr.asFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_origin_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3917,7 +3934,7 @@
   late final _sqlite3_column_origin_name16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_origin_name16');
+              pkg_ffi.Int)>>('sqlite3_column_origin_name16');
   late final _sqlite3_column_origin_name16 =
       _sqlite3_column_origin_name16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
@@ -3950,7 +3967,7 @@
   /// strongly typed, but the typing is dynamic not static.  ^Type
   /// is associated with individual values, not with the containers
   /// used to hold those values.
-  ffi.Pointer<ffi.Int8> sqlite3_column_decltype(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_column_decltype(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
@@ -3962,10 +3979,10 @@
 
   late final _sqlite3_column_decltypePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_decltype');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_decltype');
   late final _sqlite3_column_decltype = _sqlite3_column_decltypePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_decltype16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3980,7 +3997,7 @@
   late final _sqlite3_column_decltype16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
-              ffi.Int32)>>('sqlite3_column_decltype16');
+              pkg_ffi.Int)>>('sqlite3_column_decltype16');
   late final _sqlite3_column_decltype16 =
       _sqlite3_column_decltype16Ptr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
@@ -4074,7 +4091,7 @@
   }
 
   late final _sqlite3_stepPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_step');
   late final _sqlite3_step =
       _sqlite3_stepPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -4105,7 +4122,7 @@
   }
 
   late final _sqlite3_data_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_data_count');
   late final _sqlite3_data_count = _sqlite3_data_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -4330,7 +4347,7 @@
   late final _sqlite3_column_blobPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_blob');
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_blob');
   late final _sqlite3_column_blob = _sqlite3_column_blobPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4346,8 +4363,8 @@
 
   late final _sqlite3_column_doublePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Double Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_double');
+          ffi.Double Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_double');
   late final _sqlite3_column_double = _sqlite3_column_doublePtr
       .asFunction<double Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4363,8 +4380,8 @@
 
   late final _sqlite3_column_intPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_int');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_int');
   late final _sqlite3_column_int = _sqlite3_column_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4381,11 +4398,11 @@
   late final _sqlite3_column_int64Ptr = _lookup<
       ffi.NativeFunction<
           sqlite3_int64 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_int64');
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_int64');
   late final _sqlite3_column_int64 = _sqlite3_column_int64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
-  ffi.Pointer<ffi.Uint8> sqlite3_column_text(
+  ffi.Pointer<pkg_ffi.UnsignedChar> sqlite3_column_text(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
@@ -4397,10 +4414,11 @@
 
   late final _sqlite3_column_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_text');
+          ffi.Pointer<pkg_ffi.UnsignedChar> Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_text');
   late final _sqlite3_column_text = _sqlite3_column_textPtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3_stmt>, int)>();
+      ffi.Pointer<pkg_ffi.UnsignedChar> Function(
+          ffi.Pointer<sqlite3_stmt>, int)>();
 
   ffi.Pointer<ffi.Void> sqlite3_column_text16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -4414,8 +4432,8 @@
 
   late final _sqlite3_column_text16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_text16');
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_text16');
   late final _sqlite3_column_text16 = _sqlite3_column_text16Ptr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4432,7 +4450,7 @@
   late final _sqlite3_column_valuePtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_value> Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_value');
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_value');
   late final _sqlite3_column_value = _sqlite3_column_valuePtr.asFunction<
       ffi.Pointer<sqlite3_value> Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4448,8 +4466,8 @@
 
   late final _sqlite3_column_bytesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_bytes');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_bytes');
   late final _sqlite3_column_bytes = _sqlite3_column_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4465,8 +4483,8 @@
 
   late final _sqlite3_column_bytes16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_bytes16');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>,
+              pkg_ffi.Int)>>('sqlite3_column_bytes16');
   late final _sqlite3_column_bytes16 = _sqlite3_column_bytes16Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4482,8 +4500,8 @@
 
   late final _sqlite3_column_typePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_stmt>, ffi.Int32)>>('sqlite3_column_type');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int)>>('sqlite3_column_type');
   late final _sqlite3_column_type = _sqlite3_column_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int)>();
 
@@ -4520,7 +4538,7 @@
   }
 
   late final _sqlite3_finalizePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_finalize');
   late final _sqlite3_finalize = _sqlite3_finalizePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -4557,7 +4575,7 @@
   }
 
   late final _sqlite3_resetPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_reset');
   late final _sqlite3_reset =
       _sqlite3_resetPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -4687,18 +4705,18 @@
   /// statement in which the function is running.
   int sqlite3_create_function(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<pkg_ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4717,46 +4735,44 @@
     );
   }
 
-  late final _sqlite3_create_functionPtr =
-      _lookup<
-              ffi.NativeFunction<
-                  ffi.Int32 Function(
-                      ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>)>>)>>(
-          'sqlite3_create_function');
+  late final _sqlite3_create_functionPtr = _lookup<
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<sqlite3_context>)>>)>>(
+      'sqlite3_create_function');
   late final _sqlite3_create_function = _sqlite3_create_functionPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Void>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                  ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                       ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                  ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                       ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
           ffi.Pointer<
               ffi.NativeFunction<
@@ -4770,12 +4786,12 @@
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4794,32 +4810,30 @@
     );
   }
 
-  late final _sqlite3_create_function16Ptr =
-      _lookup<
-              ffi.NativeFunction<
-                  ffi.Int32 Function(
-                      ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>)>>)>>(
-          'sqlite3_create_function16');
+  late final _sqlite3_create_function16Ptr = _lookup<
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<ffi.Void>,
+                  pkg_ffi.Int,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<sqlite3_context>)>>)>>(
+      'sqlite3_create_function16');
   late final _sqlite3_create_function16 =
       _sqlite3_create_function16Ptr.asFunction<
           int Function(
@@ -4830,11 +4844,15 @@
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -4842,18 +4860,18 @@
 
   int sqlite3_create_function_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<pkg_ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4875,49 +4893,52 @@
     );
   }
 
-  late final _sqlite3_create_function_v2Ptr =
-      _lookup<
-              ffi.NativeFunction<
-                  ffi.Int32 Function(
-                      ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
-          'sqlite3_create_function_v2');
+  late final _sqlite3_create_function_v2Ptr = _lookup<
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
+      'sqlite3_create_function_v2');
   late final _sqlite3_create_function_v2 =
       _sqlite3_create_function_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               int,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -4928,13 +4949,13 @@
 
   int sqlite3_create_window_function(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFunctionName,
+    ffi.Pointer<pkg_ffi.Char> zFunctionName,
     int nArg,
     int eTextRep,
     ffi.Pointer<ffi.Void> pApp,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xStep,
     ffi.Pointer<
@@ -4945,7 +4966,7 @@
         xValue,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                ffi.Void Function(ffi.Pointer<sqlite3_context>, pkg_ffi.Int,
                     ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>
         xInverse,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -4965,48 +4986,49 @@
     );
   }
 
-  late final _sqlite3_create_window_functionPtr =
-      _lookup<
-              ffi.NativeFunction<
-                  ffi.Int32 Function(
-                      ffi.Pointer<sqlite3>,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Int32,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(
-                                  ffi.Pointer<sqlite3_context>,
-                                  ffi.Int32,
-                                  ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
-                      ffi.Pointer<
-                          ffi.NativeFunction<
-                              ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
-          'sqlite3_create_window_function');
+  late final _sqlite3_create_window_functionPtr = _lookup<
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
+                  pkg_ffi.Int,
+                  ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(
+                              ffi.Pointer<sqlite3_context>,
+                              pkg_ffi.Int,
+                              ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
+                  ffi.Pointer<
+                      ffi.NativeFunction<
+                          ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
+      'sqlite3_create_window_function');
   late final _sqlite3_create_window_function =
       _sqlite3_create_window_functionPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               int,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5016,7 +5038,9 @@
                       ffi.Void Function(ffi.Pointer<sqlite3_context>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Int32,
+                      ffi.Void Function(
+                          ffi.Pointer<sqlite3_context>,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5031,8 +5055,9 @@
   }
 
   late final _sqlite3_aggregate_countPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_context>)>>(
-      'sqlite3_aggregate_count');
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_context>)>>('sqlite3_aggregate_count');
   late final _sqlite3_aggregate_count = _sqlite3_aggregate_countPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>)>();
 
@@ -5045,7 +5070,7 @@
   }
 
   late final _sqlite3_expiredPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>(
       'sqlite3_expired');
   late final _sqlite3_expired =
       _sqlite3_expiredPtr.asFunction<int Function(ffi.Pointer<sqlite3_stmt>)>();
@@ -5062,7 +5087,7 @@
 
   late final _sqlite3_transfer_bindingsPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>,
               ffi.Pointer<sqlite3_stmt>)>>('sqlite3_transfer_bindings');
   late final _sqlite3_transfer_bindings =
       _sqlite3_transfer_bindingsPtr.asFunction<
@@ -5073,7 +5098,7 @@
   }
 
   late final _sqlite3_global_recoverPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>(
           'sqlite3_global_recover');
   late final _sqlite3_global_recover =
       _sqlite3_global_recoverPtr.asFunction<int Function()>();
@@ -5092,7 +5117,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>
+                    ffi.Pointer<ffi.Void>, sqlite3_int64, pkg_ffi.Int)>>
         arg0,
     ffi.Pointer<ffi.Void> arg1,
     int arg2,
@@ -5106,11 +5131,11 @@
 
   late final _sqlite3_memory_alarmPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>,
+                          ffi.Pointer<ffi.Void>, sqlite3_int64, pkg_ffi.Int)>>,
               ffi.Pointer<ffi.Void>,
               sqlite3_int64)>>('sqlite3_memory_alarm');
   late final _sqlite3_memory_alarm = _sqlite3_memory_alarmPtr.asFunction<
@@ -5118,7 +5143,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Void>, sqlite3_int64, ffi.Int32)>>,
+                      ffi.Pointer<ffi.Void>, sqlite3_int64, pkg_ffi.Int)>>,
           ffi.Pointer<ffi.Void>,
           int)>();
 
@@ -5286,7 +5311,7 @@
   }
 
   late final _sqlite3_value_intPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_int');
   late final _sqlite3_value_int = _sqlite3_value_intPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5308,7 +5333,7 @@
 
   ffi.Pointer<ffi.Void> sqlite3_value_pointer(
     ffi.Pointer<sqlite3_value> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg1,
   ) {
     return _sqlite3_value_pointer(
       arg0,
@@ -5319,12 +5344,12 @@
   late final _sqlite3_value_pointerPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_value>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_value_pointer');
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_value_pointer');
   late final _sqlite3_value_pointer = _sqlite3_value_pointerPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
-          ffi.Pointer<sqlite3_value>, ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<sqlite3_value>, ffi.Pointer<pkg_ffi.Char>)>();
 
-  ffi.Pointer<ffi.Uint8> sqlite3_value_text(
+  ffi.Pointer<pkg_ffi.UnsignedChar> sqlite3_value_text(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
     return _sqlite3_value_text(
@@ -5334,10 +5359,10 @@
 
   late final _sqlite3_value_textPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<pkg_ffi.UnsignedChar> Function(
               ffi.Pointer<sqlite3_value>)>>('sqlite3_value_text');
   late final _sqlite3_value_text = _sqlite3_value_textPtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3_value>)>();
+      ffi.Pointer<pkg_ffi.UnsignedChar> Function(ffi.Pointer<sqlite3_value>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_value_text16(
     ffi.Pointer<sqlite3_value> arg0,
@@ -5393,7 +5418,7 @@
   }
 
   late final _sqlite3_value_bytesPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_bytes');
   late final _sqlite3_value_bytes = _sqlite3_value_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5407,7 +5432,7 @@
   }
 
   late final _sqlite3_value_bytes16Ptr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_bytes16');
   late final _sqlite3_value_bytes16 = _sqlite3_value_bytes16Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5421,7 +5446,7 @@
   }
 
   late final _sqlite3_value_typePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_type');
   late final _sqlite3_value_type = _sqlite3_value_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5435,7 +5460,7 @@
   }
 
   late final _sqlite3_value_numeric_typePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_numeric_type');
   late final _sqlite3_value_numeric_type = _sqlite3_value_numeric_typePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5449,7 +5474,7 @@
   }
 
   late final _sqlite3_value_nochangePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_nochange');
   late final _sqlite3_value_nochange = _sqlite3_value_nochangePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5463,7 +5488,7 @@
   }
 
   late final _sqlite3_value_frombindPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_value>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_value>)>>(
       'sqlite3_value_frombind');
   late final _sqlite3_value_frombind = _sqlite3_value_frombindPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
@@ -5485,8 +5510,9 @@
   }
 
   late final _sqlite3_value_subtypePtr = _lookup<
-          ffi.NativeFunction<ffi.Uint32 Function(ffi.Pointer<sqlite3_value>)>>(
-      'sqlite3_value_subtype');
+      ffi.NativeFunction<
+          pkg_ffi.UnsignedInt Function(
+              ffi.Pointer<sqlite3_value>)>>('sqlite3_value_subtype');
   late final _sqlite3_value_subtype = _sqlite3_value_subtypePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_value>)>();
 
@@ -5585,7 +5611,7 @@
   late final _sqlite3_aggregate_contextPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_aggregate_context');
+              pkg_ffi.Int)>>('sqlite3_aggregate_context');
   late final _sqlite3_aggregate_context =
       _sqlite3_aggregate_contextPtr.asFunction<
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>, int)>();
@@ -5707,8 +5733,8 @@
 
   late final _sqlite3_get_auxdataPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>>('sqlite3_get_auxdata');
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>,
+              pkg_ffi.Int)>>('sqlite3_get_auxdata');
   late final _sqlite3_get_auxdata = _sqlite3_get_auxdataPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -5731,7 +5757,7 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -5909,7 +5935,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -5974,7 +6000,7 @@
 
   void sqlite3_result_error(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_result_error(
@@ -5986,11 +6012,11 @@
 
   late final _sqlite3_result_errorPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_result_error');
+          ffi.Void Function(ffi.Pointer<sqlite3_context>,
+              ffi.Pointer<pkg_ffi.Char>, pkg_ffi.Int)>>('sqlite3_result_error');
   late final _sqlite3_result_error = _sqlite3_result_errorPtr.asFunction<
       void Function(
-          ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Int8>, int)>();
+          ffi.Pointer<sqlite3_context>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   void sqlite3_result_error16(
     ffi.Pointer<sqlite3_context> arg0,
@@ -6007,7 +6033,7 @@
   late final _sqlite3_result_error16Ptr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Void>,
-              ffi.Int32)>>('sqlite3_result_error16');
+              pkg_ffi.Int)>>('sqlite3_result_error16');
   late final _sqlite3_result_error16 = _sqlite3_result_error16Ptr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>, ffi.Pointer<ffi.Void>, int)>();
@@ -6053,7 +6079,7 @@
   late final _sqlite3_result_error_codePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_result_error_code');
+              pkg_ffi.Int)>>('sqlite3_result_error_code');
   late final _sqlite3_result_error_code = _sqlite3_result_error_codePtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6069,8 +6095,8 @@
 
   late final _sqlite3_result_intPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>>('sqlite3_result_int');
+          ffi.Void Function(ffi.Pointer<sqlite3_context>,
+              pkg_ffi.Int)>>('sqlite3_result_int');
   late final _sqlite3_result_int = _sqlite3_result_intPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6107,7 +6133,7 @@
 
   void sqlite3_result_text(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg1,
     int arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
@@ -6124,8 +6150,8 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6133,14 +6159,14 @@
   late final _sqlite3_result_text = _sqlite3_result_textPtr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
   void sqlite3_result_text64(
     ffi.Pointer<sqlite3_context> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg1,
     int arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
@@ -6159,15 +6185,15 @@
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               sqlite3_uint64,
               ffi.Pointer<
                   ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
-              ffi.Uint8)>>('sqlite3_result_text64');
+              pkg_ffi.UnsignedChar)>>('sqlite3_result_text64');
   late final _sqlite3_result_text64 = _sqlite3_result_text64Ptr.asFunction<
       void Function(
           ffi.Pointer<sqlite3_context>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
@@ -6193,7 +6219,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6226,7 +6252,7 @@
               ffi.Void Function(
                   ffi.Pointer<sqlite3_context>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  pkg_ffi.Int,
                   ffi.Pointer<
                       ffi.NativeFunction<
                           ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
@@ -6259,7 +6285,7 @@
               ffi.Void Function(
                   ffi.Pointer<sqlite3_context>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  pkg_ffi.Int,
                   ffi.Pointer<
                       ffi.NativeFunction<
                           ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>>(
@@ -6293,7 +6319,7 @@
   void sqlite3_result_pointer(
     ffi.Pointer<sqlite3_context> arg0,
     ffi.Pointer<ffi.Void> arg1,
-    ffi.Pointer<ffi.Int8> arg2,
+    ffi.Pointer<pkg_ffi.Char> arg2,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         arg3,
   ) {
@@ -6310,7 +6336,7 @@
           ffi.Void Function(
               ffi.Pointer<sqlite3_context>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
@@ -6319,7 +6345,7 @@
       void Function(
           ffi.Pointer<sqlite3_context>,
           ffi.Pointer<ffi.Void>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<
               ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>)>();
 
@@ -6336,7 +6362,7 @@
   late final _sqlite3_result_zeroblobPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Int32)>>('sqlite3_result_zeroblob');
+              pkg_ffi.Int)>>('sqlite3_result_zeroblob');
   late final _sqlite3_result_zeroblob = _sqlite3_result_zeroblobPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6352,7 +6378,7 @@
 
   late final _sqlite3_result_zeroblob64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_context>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_context>,
               sqlite3_uint64)>>('sqlite3_result_zeroblob64');
   late final _sqlite3_result_zeroblob64 = _sqlite3_result_zeroblob64Ptr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>, int)>();
@@ -6380,7 +6406,7 @@
   late final _sqlite3_result_subtypePtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_context>,
-              ffi.Uint32)>>('sqlite3_result_subtype');
+              pkg_ffi.UnsignedInt)>>('sqlite3_result_subtype');
   late final _sqlite3_result_subtype = _sqlite3_result_subtypePtr
       .asFunction<void Function(ffi.Pointer<sqlite3_context>, int)>();
 
@@ -6465,13 +6491,13 @@
   /// See also:  [sqlite3_collation_needed()] and [sqlite3_collation_needed16()].
   int sqlite3_create_collation(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<pkg_ffi.Char> zName,
     int eTextRep,
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                pkg_ffi.Int Function(ffi.Pointer<ffi.Void>, pkg_ffi.Int,
+                    ffi.Pointer<ffi.Void>, pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
   ) {
     return _sqlite3_create_collation(
@@ -6485,45 +6511,45 @@
 
   late final _sqlite3_create_collationPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          pkg_ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_create_collation');
   late final _sqlite3_create_collation =
       _sqlite3_create_collationPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   int sqlite3_create_collation_v2(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<pkg_ffi.Char> zName,
     int eTextRep,
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                pkg_ffi.Int Function(ffi.Pointer<ffi.Void>, pkg_ffi.Int,
+                    ffi.Pointer<ffi.Void>, pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         xDestroy,
@@ -6540,18 +6566,18 @@
 
   late final _sqlite3_create_collation_v2Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
-                  ffi.Int32,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  pkg_ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          pkg_ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>)>>,
                   ffi.Pointer<
                       ffi.NativeFunction<
@@ -6561,16 +6587,16 @@
       _sqlite3_create_collation_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<
                   ffi.NativeFunction<
@@ -6583,8 +6609,8 @@
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Int32,
-                    ffi.Pointer<ffi.Void>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                pkg_ffi.Int Function(ffi.Pointer<ffi.Void>, pkg_ffi.Int,
+                    ffi.Pointer<ffi.Void>, pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>
         xCompare,
   ) {
     return _sqlite3_create_collation16(
@@ -6598,18 +6624,18 @@
 
   late final _sqlite3_create_collation16Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
-                  ffi.Int32,
+                  pkg_ffi.Int,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          pkg_ffi.Int Function(
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_create_collation16');
   late final _sqlite3_create_collation16 =
@@ -6621,11 +6647,11 @@
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   /// CAPI3REF: Collation Needed Callbacks
@@ -6659,7 +6685,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Int32, ffi.Pointer<ffi.Int8>)>>
+                    pkg_ffi.Int, ffi.Pointer<pkg_ffi.Char>)>>
         arg2,
   ) {
     return _sqlite3_collation_needed(
@@ -6671,7 +6697,7 @@
 
   late final _sqlite3_collation_neededPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -6679,8 +6705,8 @@
                           ffi.Void Function(
                               ffi.Pointer<ffi.Void>,
                               ffi.Pointer<sqlite3>,
-                              ffi.Int32,
-                              ffi.Pointer<ffi.Int8>)>>)>>(
+                              pkg_ffi.Int,
+                              ffi.Pointer<pkg_ffi.Char>)>>)>>(
       'sqlite3_collation_needed');
   late final _sqlite3_collation_needed =
       _sqlite3_collation_neededPtr.asFunction<
@@ -6692,8 +6718,8 @@
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>)>>)>();
+                          pkg_ffi.Int,
+                          ffi.Pointer<pkg_ffi.Char>)>>)>();
 
   int sqlite3_collation_needed16(
     ffi.Pointer<sqlite3> arg0,
@@ -6701,7 +6727,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Int32, ffi.Pointer<ffi.Void>)>>
+                    pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>
         arg2,
   ) {
     return _sqlite3_collation_needed16(
@@ -6713,7 +6739,7 @@
 
   late final _sqlite3_collation_needed16Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -6721,7 +6747,7 @@
                           ffi.Void Function(
                               ffi.Pointer<ffi.Void>,
                               ffi.Pointer<sqlite3>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Void>)>>)>>(
       'sqlite3_collation_needed16');
   late final _sqlite3_collation_needed16 =
@@ -6734,7 +6760,7 @@
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<ffi.Void>)>>)>();
 
   /// CAPI3REF: Suspend Execution For A Short Time
@@ -6761,7 +6787,7 @@
   }
 
   late final _sqlite3_sleepPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>(
           'sqlite3_sleep');
   late final _sqlite3_sleep = _sqlite3_sleepPtr.asFunction<int Function(int)>();
 
@@ -6819,13 +6845,13 @@
   /// &nbsp;     NULL, NULL);
   /// sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
   /// </pre></blockquote>
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_temp_directory =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_temp_directory');
+  late final ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> _sqlite3_temp_directory =
+      _lookup<ffi.Pointer<pkg_ffi.Char>>('sqlite3_temp_directory');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_temp_directory =>
+  ffi.Pointer<pkg_ffi.Char> get sqlite3_temp_directory =>
       _sqlite3_temp_directory.value;
 
-  set sqlite3_temp_directory(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_temp_directory(ffi.Pointer<pkg_ffi.Char> value) =>
       _sqlite3_temp_directory.value = value;
 
   /// CAPI3REF: Name Of The Folder Holding Database Files
@@ -6861,13 +6887,13 @@
   /// Hence, if this variable is modified directly, either it should be
   /// made NULL or made to point to memory obtained from [sqlite3_malloc]
   /// or else the use of the [data_store_directory pragma] should be avoided.
-  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _sqlite3_data_directory =
-      _lookup<ffi.Pointer<ffi.Int8>>('sqlite3_data_directory');
+  late final ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> _sqlite3_data_directory =
+      _lookup<ffi.Pointer<pkg_ffi.Char>>('sqlite3_data_directory');
 
-  ffi.Pointer<ffi.Int8> get sqlite3_data_directory =>
+  ffi.Pointer<pkg_ffi.Char> get sqlite3_data_directory =>
       _sqlite3_data_directory.value;
 
-  set sqlite3_data_directory(ffi.Pointer<ffi.Int8> value) =>
+  set sqlite3_data_directory(ffi.Pointer<pkg_ffi.Char> value) =>
       _sqlite3_data_directory.value = value;
 
   /// CAPI3REF: Win32 Specific Interface
@@ -6899,14 +6925,14 @@
 
   late final _sqlite3_win32_set_directoryPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
+          pkg_ffi.Int Function(pkg_ffi.UnsignedLong,
               ffi.Pointer<ffi.Void>)>>('sqlite3_win32_set_directory');
   late final _sqlite3_win32_set_directory = _sqlite3_win32_set_directoryPtr
       .asFunction<int Function(int, ffi.Pointer<ffi.Void>)>();
 
   int sqlite3_win32_set_directory8(
     int type,
-    ffi.Pointer<ffi.Int8> zValue,
+    ffi.Pointer<pkg_ffi.Char> zValue,
   ) {
     return _sqlite3_win32_set_directory8(
       type,
@@ -6916,10 +6942,10 @@
 
   late final _sqlite3_win32_set_directory8Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_win32_set_directory8');
+          pkg_ffi.Int Function(pkg_ffi.UnsignedLong,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_win32_set_directory8');
   late final _sqlite3_win32_set_directory8 = _sqlite3_win32_set_directory8Ptr
-      .asFunction<int Function(int, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<int Function(int, ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_win32_set_directory16(
     int type,
@@ -6933,7 +6959,7 @@
 
   late final _sqlite3_win32_set_directory16Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Uint64,
+          pkg_ffi.Int Function(pkg_ffi.UnsignedLong,
               ffi.Pointer<ffi.Void>)>>('sqlite3_win32_set_directory16');
   late final _sqlite3_win32_set_directory16 = _sqlite3_win32_set_directory16Ptr
       .asFunction<int Function(int, ffi.Pointer<ffi.Void>)>();
@@ -6967,7 +6993,7 @@
   }
 
   late final _sqlite3_get_autocommitPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_get_autocommit');
   late final _sqlite3_get_autocommit = _sqlite3_get_autocommitPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -7024,9 +7050,9 @@
   /// <li> [sqlite3_filename_journal()]
   /// <li> [sqlite3_filename_wal()]
   /// </ul>
-  ffi.Pointer<ffi.Int8> sqlite3_db_filename(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_db_filename(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<pkg_ffi.Char> zDbName,
   ) {
     return _sqlite3_db_filename(
       db,
@@ -7036,11 +7062,11 @@
 
   late final _sqlite3_db_filenamePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_db_filename');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_db_filename');
   late final _sqlite3_db_filename = _sqlite3_db_filenamePtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+      ffi.Pointer<pkg_ffi.Char> Function(
+          ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Determine if a database is read-only
   /// METHOD: sqlite3
@@ -7050,7 +7076,7 @@
   /// the name of a database on connection D.
   int sqlite3_db_readonly(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<pkg_ffi.Char> zDbName,
   ) {
     return _sqlite3_db_readonly(
       db,
@@ -7060,10 +7086,10 @@
 
   late final _sqlite3_db_readonlyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_db_readonly');
-  late final _sqlite3_db_readonly = _sqlite3_db_readonlyPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_db_readonly');
+  late final _sqlite3_db_readonly = _sqlite3_db_readonlyPtr.asFunction<
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Find the next prepared statement
   /// METHOD: sqlite3
@@ -7142,7 +7168,7 @@
   /// See also the [sqlite3_update_hook()] interface.
   ffi.Pointer<ffi.Void> sqlite3_commit_hook(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>
+    ffi.Pointer<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -7159,13 +7185,13 @@
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+                      pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_commit_hook');
   late final _sqlite3_commit_hook = _sqlite3_commit_hookPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
-              ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>>,
+              ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>>,
           ffi.Pointer<ffi.Void>)>();
 
   ffi.Pointer<ffi.Void> sqlite3_rollback_hook(
@@ -7248,9 +7274,9 @@
             ffi.NativeFunction<
                 ffi.Void Function(
                     ffi.Pointer<ffi.Void>,
-                    ffi.Int32,
-                    ffi.Pointer<ffi.Int8>,
-                    ffi.Pointer<ffi.Int8>,
+                    pkg_ffi.Int,
+                    ffi.Pointer<pkg_ffi.Char>,
+                    ffi.Pointer<pkg_ffi.Char>,
                     sqlite3_int64)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
@@ -7270,9 +7296,9 @@
                   ffi.NativeFunction<
                       ffi.Void Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Pointer<ffi.Int8>,
+                          pkg_ffi.Int,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          ffi.Pointer<pkg_ffi.Char>,
                           sqlite3_int64)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_update_hook');
   late final _sqlite3_update_hook = _sqlite3_update_hookPtr.asFunction<
@@ -7282,9 +7308,9 @@
               ffi.NativeFunction<
                   ffi.Void Function(
                       ffi.Pointer<ffi.Void>,
-                      ffi.Int32,
-                      ffi.Pointer<ffi.Int8>,
-                      ffi.Pointer<ffi.Int8>,
+                      pkg_ffi.Int,
+                      ffi.Pointer<pkg_ffi.Char>,
+                      ffi.Pointer<pkg_ffi.Char>,
                       sqlite3_int64)>>,
           ffi.Pointer<ffi.Void>)>();
 
@@ -7334,7 +7360,7 @@
   }
 
   late final _sqlite3_enable_shared_cachePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>(
           'sqlite3_enable_shared_cache');
   late final _sqlite3_enable_shared_cache =
       _sqlite3_enable_shared_cachePtr.asFunction<int Function(int)>();
@@ -7360,7 +7386,7 @@
   }
 
   late final _sqlite3_release_memoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>(
           'sqlite3_release_memory');
   late final _sqlite3_release_memory =
       _sqlite3_release_memoryPtr.asFunction<int Function(int)>();
@@ -7384,7 +7410,7 @@
   }
 
   late final _sqlite3_db_release_memoryPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_db_release_memory');
   late final _sqlite3_db_release_memory = _sqlite3_db_release_memoryPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -7495,7 +7521,7 @@
   }
 
   late final _sqlite3_soft_heap_limitPtr =
-      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<ffi.Void Function(pkg_ffi.Int)>>(
           'sqlite3_soft_heap_limit');
   late final _sqlite3_soft_heap_limit =
       _sqlite3_soft_heap_limitPtr.asFunction<void Function(int)>();
@@ -7569,14 +7595,14 @@
   /// any errors are encountered while loading the schema.
   int sqlite3_table_column_metadata(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDbName,
-    ffi.Pointer<ffi.Int8> zTableName,
-    ffi.Pointer<ffi.Int8> zColumnName,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzDataType,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzCollSeq,
-    ffi.Pointer<ffi.Int32> pNotNull,
-    ffi.Pointer<ffi.Int32> pPrimaryKey,
-    ffi.Pointer<ffi.Int32> pAutoinc,
+    ffi.Pointer<pkg_ffi.Char> zDbName,
+    ffi.Pointer<pkg_ffi.Char> zTableName,
+    ffi.Pointer<pkg_ffi.Char> zColumnName,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzDataType,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzCollSeq,
+    ffi.Pointer<pkg_ffi.Int> pNotNull,
+    ffi.Pointer<pkg_ffi.Int> pPrimaryKey,
+    ffi.Pointer<pkg_ffi.Int> pAutoinc,
   ) {
     return _sqlite3_table_column_metadata(
       db,
@@ -7593,28 +7619,28 @@
 
   late final _sqlite3_table_column_metadataPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_table_column_metadata');
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>>('sqlite3_table_column_metadata');
   late final _sqlite3_table_column_metadata =
       _sqlite3_table_column_metadataPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>();
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>();
 
   /// CAPI3REF: Load An Extension
   /// METHOD: sqlite3
@@ -7660,9 +7686,9 @@
   /// See also the [load_extension() SQL function].
   int sqlite3_load_extension(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zFile,
-    ffi.Pointer<ffi.Int8> zProc,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrMsg,
+    ffi.Pointer<pkg_ffi.Char> zFile,
+    ffi.Pointer<pkg_ffi.Char> zProc,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> pzErrMsg,
   ) {
     return _sqlite3_load_extension(
       db,
@@ -7673,15 +7699,16 @@
   }
 
   late final _sqlite3_load_extensionPtr = _lookup<
-      ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_load_extension');
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  ffi.Pointer<pkg_ffi.Char>,
+                  ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>(
+      'sqlite3_load_extension');
   late final _sqlite3_load_extension = _sqlite3_load_extensionPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   /// CAPI3REF: Enable Or Disable Extension Loading
   /// METHOD: sqlite3
@@ -7718,8 +7745,8 @@
 
   late final _sqlite3_enable_load_extensionPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Int32)>>('sqlite3_enable_load_extension');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              pkg_ffi.Int)>>('sqlite3_enable_load_extension');
   late final _sqlite3_enable_load_extension = _sqlite3_enable_load_extensionPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -7767,7 +7794,7 @@
 
   late final _sqlite3_auto_extensionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>(
       'sqlite3_auto_extension');
   late final _sqlite3_auto_extension = _sqlite3_auto_extensionPtr.asFunction<
@@ -7791,7 +7818,7 @@
 
   late final _sqlite3_cancel_auto_extensionPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>>(
       'sqlite3_cancel_auto_extension');
   late final _sqlite3_cancel_auto_extension =
@@ -7844,7 +7871,7 @@
   /// See also: [sqlite3_drop_modules()]
   int sqlite3_create_module(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<pkg_ffi.Char> zName,
     ffi.Pointer<sqlite3_module> p,
     ffi.Pointer<ffi.Void> pClientData,
   ) {
@@ -7858,18 +7885,18 @@
 
   late final _sqlite3_create_modulePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3_module>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_create_module');
   late final _sqlite3_create_module = _sqlite3_create_modulePtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<sqlite3_module>, ffi.Pointer<ffi.Void>)>();
 
   int sqlite3_create_module_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zName,
+    ffi.Pointer<pkg_ffi.Char> zName,
     ffi.Pointer<sqlite3_module> p,
     ffi.Pointer<ffi.Void> pClientData,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -7886,9 +7913,9 @@
 
   late final _sqlite3_create_module_v2Ptr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
+                  ffi.Pointer<pkg_ffi.Char>,
                   ffi.Pointer<sqlite3_module>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -7899,7 +7926,7 @@
       _sqlite3_create_module_v2Ptr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3_module>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
@@ -7918,7 +7945,7 @@
   /// See also: [sqlite3_create_module()]
   int sqlite3_drop_modules(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> azKeep,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> azKeep,
   ) {
     return _sqlite3_drop_modules(
       db,
@@ -7928,10 +7955,11 @@
 
   late final _sqlite3_drop_modulesPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>>('sqlite3_drop_modules');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>>('sqlite3_drop_modules');
   late final _sqlite3_drop_modules = _sqlite3_drop_modulesPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Pointer<ffi.Int8>>)>();
+      int Function(
+          ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>();
 
   /// CAPI3REF: Declare The Schema Of A Virtual Table
   ///
@@ -7941,7 +7969,7 @@
   /// the virtual tables they implement.
   int sqlite3_declare_vtab(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zSQL,
+    ffi.Pointer<pkg_ffi.Char> zSQL,
   ) {
     return _sqlite3_declare_vtab(
       arg0,
@@ -7951,10 +7979,10 @@
 
   late final _sqlite3_declare_vtabPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_declare_vtab');
-  late final _sqlite3_declare_vtab = _sqlite3_declare_vtabPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_declare_vtab');
+  late final _sqlite3_declare_vtab = _sqlite3_declare_vtabPtr.asFunction<
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Overload A Function For A Virtual Table
   /// METHOD: sqlite3
@@ -7973,7 +8001,7 @@
   /// by a [virtual table].
   int sqlite3_overload_function(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zFuncName,
+    ffi.Pointer<pkg_ffi.Char> zFuncName,
     int nArg,
   ) {
     return _sqlite3_overload_function(
@@ -7985,11 +8013,11 @@
 
   late final _sqlite3_overload_functionPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_overload_function');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int)>>('sqlite3_overload_function');
   late final _sqlite3_overload_function =
       _sqlite3_overload_functionPtr.asFunction<
-          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int)>();
+          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// CAPI3REF: Open A BLOB For Incremental I/O
   /// METHOD: sqlite3
@@ -8074,9 +8102,9 @@
   /// [sqlite3_blob_bytes()], [sqlite3_blob_write()].
   int sqlite3_blob_open(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zDb,
-    ffi.Pointer<ffi.Int8> zTable,
-    ffi.Pointer<ffi.Int8> zColumn,
+    ffi.Pointer<pkg_ffi.Char> zDb,
+    ffi.Pointer<pkg_ffi.Char> zTable,
+    ffi.Pointer<pkg_ffi.Char> zColumn,
     int iRow,
     int flags,
     ffi.Pointer<ffi.Pointer<sqlite3_blob>> ppBlob,
@@ -8094,20 +8122,20 @@
 
   late final _sqlite3_blob_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
               sqlite3_int64,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_blob>>)>>('sqlite3_blob_open');
   late final _sqlite3_blob_open = _sqlite3_blob_openPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.Char>,
           int,
           int,
           ffi.Pointer<ffi.Pointer<sqlite3_blob>>)>();
@@ -8145,7 +8173,7 @@
 
   late final _sqlite3_blob_reopenPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_blob>,
               sqlite3_int64)>>('sqlite3_blob_reopen');
   late final _sqlite3_blob_reopen = _sqlite3_blob_reopenPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>, int)>();
@@ -8178,7 +8206,7 @@
   }
 
   late final _sqlite3_blob_closePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_blob>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_blob>)>>(
       'sqlite3_blob_close');
   late final _sqlite3_blob_close = _sqlite3_blob_closePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>)>();
@@ -8204,7 +8232,7 @@
   }
 
   late final _sqlite3_blob_bytesPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_blob>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_blob>)>>(
       'sqlite3_blob_bytes');
   late final _sqlite3_blob_bytes = _sqlite3_blob_bytesPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_blob>)>();
@@ -8250,8 +8278,8 @@
 
   late final _sqlite3_blob_readPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, ffi.Int32)>>('sqlite3_blob_read');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
+              pkg_ffi.Int, pkg_ffi.Int)>>('sqlite3_blob_read');
   late final _sqlite3_blob_read = _sqlite3_blob_readPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>, int, int)>();
@@ -8310,8 +8338,8 @@
 
   late final _sqlite3_blob_writePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, ffi.Int32)>>('sqlite3_blob_write');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>,
+              pkg_ffi.Int, pkg_ffi.Int)>>('sqlite3_blob_write');
   late final _sqlite3_blob_write = _sqlite3_blob_writePtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_blob>, ffi.Pointer<ffi.Void>, int, int)>();
@@ -8344,7 +8372,7 @@
   /// ^(If the default VFS is unregistered, another VFS is chosen as
   /// the default.  The choice for the new VFS is arbitrary.)^
   ffi.Pointer<sqlite3_vfs> sqlite3_vfs_find(
-    ffi.Pointer<ffi.Int8> zVfsName,
+    ffi.Pointer<pkg_ffi.Char> zVfsName,
   ) {
     return _sqlite3_vfs_find(
       zVfsName,
@@ -8354,9 +8382,9 @@
   late final _sqlite3_vfs_findPtr = _lookup<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_vfs> Function(
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_vfs_find');
-  late final _sqlite3_vfs_find = _sqlite3_vfs_findPtr
-      .asFunction<ffi.Pointer<sqlite3_vfs> Function(ffi.Pointer<ffi.Int8>)>();
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_vfs_find');
+  late final _sqlite3_vfs_find = _sqlite3_vfs_findPtr.asFunction<
+      ffi.Pointer<sqlite3_vfs> Function(ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_vfs_register(
     ffi.Pointer<sqlite3_vfs> arg0,
@@ -8370,8 +8398,8 @@
 
   late final _sqlite3_vfs_registerPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Int32)>>('sqlite3_vfs_register');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_vfs>, pkg_ffi.Int)>>('sqlite3_vfs_register');
   late final _sqlite3_vfs_register = _sqlite3_vfs_registerPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_vfs>, int)>();
 
@@ -8383,9 +8411,9 @@
     );
   }
 
-  late final _sqlite3_vfs_unregisterPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>)>>(
-          'sqlite3_vfs_unregister');
+  late final _sqlite3_vfs_unregisterPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>)>>(
+      'sqlite3_vfs_unregister');
   late final _sqlite3_vfs_unregister = _sqlite3_vfs_unregisterPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_vfs>)>();
 
@@ -8510,7 +8538,7 @@
   }
 
   late final _sqlite3_mutex_allocPtr = _lookup<
-          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int32)>>(
+          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(pkg_ffi.Int)>>(
       'sqlite3_mutex_alloc');
   late final _sqlite3_mutex_alloc = _sqlite3_mutex_allocPtr
       .asFunction<ffi.Pointer<sqlite3_mutex> Function(int)>();
@@ -8552,7 +8580,7 @@
   }
 
   late final _sqlite3_mutex_tryPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
       'sqlite3_mutex_try');
   late final _sqlite3_mutex_try = _sqlite3_mutex_tryPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
@@ -8580,7 +8608,7 @@
   }
 
   late final _sqlite3_mutex_heldPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
       'sqlite3_mutex_held');
   late final _sqlite3_mutex_held = _sqlite3_mutex_heldPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
@@ -8594,7 +8622,7 @@
   }
 
   late final _sqlite3_mutex_notheldPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>(
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>(
       'sqlite3_mutex_notheld');
   late final _sqlite3_mutex_notheld = _sqlite3_mutex_notheldPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_mutex>)>();
@@ -8663,7 +8691,7 @@
   /// See also: [file control opcodes]
   int sqlite3_file_control(
     ffi.Pointer<sqlite3> arg0,
-    ffi.Pointer<ffi.Int8> zDbName,
+    ffi.Pointer<pkg_ffi.Char> zDbName,
     int op,
     ffi.Pointer<ffi.Void> arg3,
   ) {
@@ -8677,10 +8705,10 @@
 
   late final _sqlite3_file_controlPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Void>)>>('sqlite3_file_control');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>('sqlite3_file_control');
   late final _sqlite3_file_control = _sqlite3_file_controlPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>, int,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Testing Interface
@@ -8707,7 +8735,7 @@
   }
 
   late final _sqlite3_test_controlPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>(
           'sqlite3_test_control');
   late final _sqlite3_test_control =
       _sqlite3_test_controlPtr.asFunction<int Function(int)>();
@@ -8762,15 +8790,15 @@
   }
 
   late final _sqlite3_keyword_countPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function()>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function()>>(
           'sqlite3_keyword_count');
   late final _sqlite3_keyword_count =
       _sqlite3_keyword_countPtr.asFunction<int Function()>();
 
   int sqlite3_keyword_name(
     int arg0,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> arg1,
-    ffi.Pointer<ffi.Int32> arg2,
+    ffi.Pointer<ffi.Pointer<pkg_ffi.Char>> arg1,
+    ffi.Pointer<pkg_ffi.Int> arg2,
   ) {
     return _sqlite3_keyword_name(
       arg0,
@@ -8781,14 +8809,16 @@
 
   late final _sqlite3_keyword_namePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_keyword_name');
+          pkg_ffi.Int Function(
+              pkg_ffi.Int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.Int>)>>('sqlite3_keyword_name');
   late final _sqlite3_keyword_name = _sqlite3_keyword_namePtr.asFunction<
-      int Function(
-          int, ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Int32>)>();
+      int Function(int, ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+          ffi.Pointer<pkg_ffi.Int>)>();
 
   int sqlite3_keyword_check(
-    ffi.Pointer<ffi.Int8> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg0,
     int arg1,
   ) {
     return _sqlite3_keyword_check(
@@ -8799,10 +8829,10 @@
 
   late final _sqlite3_keyword_checkPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<ffi.Int8>, ffi.Int32)>>('sqlite3_keyword_check');
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int)>>('sqlite3_keyword_check');
   late final _sqlite3_keyword_check = _sqlite3_keyword_checkPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, int)>();
+      .asFunction<int Function(ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// CAPI3REF: Create A New Dynamic String Object
   /// CONSTRUCTOR: sqlite3_str
@@ -8853,7 +8883,7 @@
   /// errors were encountered during construction of the string.  ^The
   /// [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
   /// string in [sqlite3_str] object X is zero bytes long.
-  ffi.Pointer<ffi.Int8> sqlite3_str_finish(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_str_finish(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
     return _sqlite3_str_finish(
@@ -8863,10 +8893,10 @@
 
   late final _sqlite3_str_finishPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3_str>)>>('sqlite3_str_finish');
-  late final _sqlite3_str_finish = _sqlite3_str_finishPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_str>)>();
+  late final _sqlite3_str_finish = _sqlite3_str_finishPtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_str>)>();
 
   /// CAPI3REF: Add Content To A Dynamic String
   /// METHOD: sqlite3_str
@@ -8900,7 +8930,7 @@
   /// subsequent call to [sqlite3_str_errcode(X)].
   void sqlite3_str_appendf(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zFormat,
+    ffi.Pointer<pkg_ffi.Char> zFormat,
   ) {
     return _sqlite3_str_appendf(
       arg0,
@@ -8911,13 +8941,13 @@
   late final _sqlite3_str_appendfPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_str>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_str_appendf');
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_str_appendf');
   late final _sqlite3_str_appendf = _sqlite3_str_appendfPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>)>();
+      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void sqlite3_str_append(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zIn,
+    ffi.Pointer<pkg_ffi.Char> zIn,
     int N,
   ) {
     return _sqlite3_str_append(
@@ -8929,14 +8959,15 @@
 
   late final _sqlite3_str_appendPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_str_append');
+          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int)>>('sqlite3_str_append');
   late final _sqlite3_str_append = _sqlite3_str_appendPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>, int)>();
+      void Function(
+          ffi.Pointer<sqlite3_str>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   void sqlite3_str_appendall(
     ffi.Pointer<sqlite3_str> arg0,
-    ffi.Pointer<ffi.Int8> zIn,
+    ffi.Pointer<pkg_ffi.Char> zIn,
   ) {
     return _sqlite3_str_appendall(
       arg0,
@@ -8947,9 +8978,9 @@
   late final _sqlite3_str_appendallPtr = _lookup<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_str>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_str_appendall');
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_str_appendall');
   late final _sqlite3_str_appendall = _sqlite3_str_appendallPtr.asFunction<
-      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<ffi.Int8>)>();
+      void Function(ffi.Pointer<sqlite3_str>, ffi.Pointer<pkg_ffi.Char>)>();
 
   void sqlite3_str_appendchar(
     ffi.Pointer<sqlite3_str> arg0,
@@ -8965,8 +8996,8 @@
 
   late final _sqlite3_str_appendcharPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Pointer<sqlite3_str>, ffi.Int32,
-              ffi.Int8)>>('sqlite3_str_appendchar');
+          ffi.Void Function(ffi.Pointer<sqlite3_str>, pkg_ffi.Int,
+              pkg_ffi.Char)>>('sqlite3_str_appendchar');
   late final _sqlite3_str_appendchar = _sqlite3_str_appendcharPtr
       .asFunction<void Function(ffi.Pointer<sqlite3_str>, int, int)>();
 
@@ -9019,9 +9050,9 @@
     );
   }
 
-  late final _sqlite3_str_errcodePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_str>)>>(
-          'sqlite3_str_errcode');
+  late final _sqlite3_str_errcodePtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_str>)>>(
+      'sqlite3_str_errcode');
   late final _sqlite3_str_errcode = _sqlite3_str_errcodePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_str>)>();
 
@@ -9033,13 +9064,13 @@
     );
   }
 
-  late final _sqlite3_str_lengthPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_str>)>>(
-          'sqlite3_str_length');
+  late final _sqlite3_str_lengthPtr = _lookup<
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_str>)>>(
+      'sqlite3_str_length');
   late final _sqlite3_str_length = _sqlite3_str_lengthPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_str>)>();
 
-  ffi.Pointer<ffi.Int8> sqlite3_str_value(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_str_value(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
     return _sqlite3_str_value(
@@ -9049,10 +9080,10 @@
 
   late final _sqlite3_str_valuePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(
+          ffi.Pointer<pkg_ffi.Char> Function(
               ffi.Pointer<sqlite3_str>)>>('sqlite3_str_value');
-  late final _sqlite3_str_value = _sqlite3_str_valuePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_str>)>();
+  late final _sqlite3_str_value = _sqlite3_str_valuePtr.asFunction<
+      ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_str>)>();
 
   /// CAPI3REF: SQLite Runtime Status
   ///
@@ -9080,8 +9111,8 @@
   /// See also: [sqlite3_db_status()]
   int sqlite3_status(
     int op,
-    ffi.Pointer<ffi.Int32> pCurrent,
-    ffi.Pointer<ffi.Int32> pHighwater,
+    ffi.Pointer<pkg_ffi.Int> pCurrent,
+    ffi.Pointer<pkg_ffi.Int> pHighwater,
     int resetFlag,
   ) {
     return _sqlite3_status(
@@ -9094,10 +9125,11 @@
 
   late final _sqlite3_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>, ffi.Int32)>>('sqlite3_status');
+          pkg_ffi.Int Function(pkg_ffi.Int, ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>, pkg_ffi.Int)>>('sqlite3_status');
   late final _sqlite3_status = _sqlite3_statusPtr.asFunction<
-      int Function(int, ffi.Pointer<ffi.Int32>, ffi.Pointer<ffi.Int32>, int)>();
+      int Function(
+          int, ffi.Pointer<pkg_ffi.Int>, ffi.Pointer<pkg_ffi.Int>, int)>();
 
   int sqlite3_status64(
     int op,
@@ -9115,8 +9147,8 @@
 
   late final _sqlite3_status64Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Int32, ffi.Pointer<sqlite3_int64>,
-              ffi.Pointer<sqlite3_int64>, ffi.Int32)>>('sqlite3_status64');
+          pkg_ffi.Int Function(pkg_ffi.Int, ffi.Pointer<sqlite3_int64>,
+              ffi.Pointer<sqlite3_int64>, pkg_ffi.Int)>>('sqlite3_status64');
   late final _sqlite3_status64 = _sqlite3_status64Ptr.asFunction<
       int Function(
           int, ffi.Pointer<sqlite3_int64>, ffi.Pointer<sqlite3_int64>, int)>();
@@ -9145,8 +9177,8 @@
   int sqlite3_db_status(
     ffi.Pointer<sqlite3> arg0,
     int op,
-    ffi.Pointer<ffi.Int32> pCur,
-    ffi.Pointer<ffi.Int32> pHiwtr,
+    ffi.Pointer<pkg_ffi.Int> pCur,
+    ffi.Pointer<pkg_ffi.Int> pHiwtr,
     int resetFlg,
   ) {
     return _sqlite3_db_status(
@@ -9160,15 +9192,15 @@
 
   late final _sqlite3_db_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Int32)>>('sqlite3_db_status');
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>,
+              pkg_ffi.Int)>>('sqlite3_db_status');
   late final _sqlite3_db_status = _sqlite3_db_statusPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, int, ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<ffi.Int32>, int)>();
+      int Function(ffi.Pointer<sqlite3>, int, ffi.Pointer<pkg_ffi.Int>,
+          ffi.Pointer<pkg_ffi.Int>, int)>();
 
   /// CAPI3REF: Prepared Statement Status
   /// METHOD: sqlite3_stmt
@@ -9206,8 +9238,8 @@
 
   late final _sqlite3_stmt_statusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32,
-              ffi.Int32)>>('sqlite3_stmt_status');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
+              pkg_ffi.Int)>>('sqlite3_stmt_status');
   late final _sqlite3_stmt_status = _sqlite3_stmt_statusPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_stmt>, int, int)>();
 
@@ -9397,9 +9429,9 @@
   /// possible that they return invalid values.
   ffi.Pointer<sqlite3_backup> sqlite3_backup_init(
     ffi.Pointer<sqlite3> pDest,
-    ffi.Pointer<ffi.Int8> zDestName,
+    ffi.Pointer<pkg_ffi.Char> zDestName,
     ffi.Pointer<sqlite3> pSource,
-    ffi.Pointer<ffi.Int8> zSourceName,
+    ffi.Pointer<pkg_ffi.Char> zSourceName,
   ) {
     return _sqlite3_backup_init(
       pDest,
@@ -9413,15 +9445,15 @@
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_backup> Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_backup_init');
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_backup_init');
   late final _sqlite3_backup_init = _sqlite3_backup_initPtr.asFunction<
       ffi.Pointer<sqlite3_backup> Function(
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>,
+          ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>)>();
+          ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_backup_step(
     ffi.Pointer<sqlite3_backup> p,
@@ -9435,8 +9467,8 @@
 
   late final _sqlite3_backup_stepPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_backup>, ffi.Int32)>>('sqlite3_backup_step');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_backup>,
+              pkg_ffi.Int)>>('sqlite3_backup_step');
   late final _sqlite3_backup_step = _sqlite3_backup_stepPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>, int)>();
 
@@ -9449,8 +9481,9 @@
   }
 
   late final _sqlite3_backup_finishPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
-      'sqlite3_backup_finish');
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_backup>)>>('sqlite3_backup_finish');
   late final _sqlite3_backup_finish = _sqlite3_backup_finishPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
 
@@ -9463,8 +9496,9 @@
   }
 
   late final _sqlite3_backup_remainingPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
-      'sqlite3_backup_remaining');
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_backup>)>>('sqlite3_backup_remaining');
   late final _sqlite3_backup_remaining = _sqlite3_backup_remainingPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
 
@@ -9477,8 +9511,9 @@
   }
 
   late final _sqlite3_backup_pagecountPtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_backup>)>>(
-      'sqlite3_backup_pagecount');
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_backup>)>>('sqlite3_backup_pagecount');
   late final _sqlite3_backup_pagecount = _sqlite3_backup_pagecountPtr
       .asFunction<int Function(ffi.Pointer<sqlite3_backup>)>();
 
@@ -9600,7 +9635,7 @@
     ffi.Pointer<
             ffi.NativeFunction<
                 ffi.Void Function(
-                    ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>
+                    ffi.Pointer<ffi.Pointer<ffi.Void>>, pkg_ffi.Int)>>
         xNotify,
     ffi.Pointer<ffi.Void> pNotifyArg,
   ) {
@@ -9613,12 +9648,12 @@
 
   late final _sqlite3_unlock_notifyPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
                       ffi.Void Function(
-                          ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>,
+                          ffi.Pointer<ffi.Pointer<ffi.Void>>, pkg_ffi.Int)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_unlock_notify');
   late final _sqlite3_unlock_notify = _sqlite3_unlock_notifyPtr.asFunction<
       int Function(
@@ -9626,7 +9661,7 @@
           ffi.Pointer<
               ffi.NativeFunction<
                   ffi.Void Function(
-                      ffi.Pointer<ffi.Pointer<ffi.Void>>, ffi.Int32)>>,
+                      ffi.Pointer<ffi.Pointer<ffi.Void>>, pkg_ffi.Int)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: String Comparison
@@ -9636,8 +9671,8 @@
   /// strings in a case-independent fashion, using the same definition of "case
   /// independence" that SQLite uses internally when comparing identifiers.
   int sqlite3_stricmp(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg1,
   ) {
     return _sqlite3_stricmp(
       arg0,
@@ -9647,14 +9682,14 @@
 
   late final _sqlite3_stricmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_stricmp');
-  late final _sqlite3_stricmp = _sqlite3_stricmpPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_stricmp');
+  late final _sqlite3_stricmp = _sqlite3_stricmpPtr.asFunction<
+      int Function(ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>();
 
   int sqlite3_strnicmp(
-    ffi.Pointer<ffi.Int8> arg0,
-    ffi.Pointer<ffi.Int8> arg1,
+    ffi.Pointer<pkg_ffi.Char> arg0,
+    ffi.Pointer<pkg_ffi.Char> arg1,
     int arg2,
   ) {
     return _sqlite3_strnicmp(
@@ -9666,10 +9701,11 @@
 
   late final _sqlite3_strnicmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32)>>('sqlite3_strnicmp');
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>, pkg_ffi.Int)>>('sqlite3_strnicmp');
   late final _sqlite3_strnicmp = _sqlite3_strnicmpPtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// CAPI3REF: String Globbing
   ///
@@ -9685,8 +9721,8 @@
   ///
   /// See also: [sqlite3_strlike()].
   int sqlite3_strglob(
-    ffi.Pointer<ffi.Int8> zGlob,
-    ffi.Pointer<ffi.Int8> zStr,
+    ffi.Pointer<pkg_ffi.Char> zGlob,
+    ffi.Pointer<pkg_ffi.Char> zStr,
   ) {
     return _sqlite3_strglob(
       zGlob,
@@ -9696,10 +9732,10 @@
 
   late final _sqlite3_strglobPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_strglob');
-  late final _sqlite3_strglob = _sqlite3_strglobPtr
-      .asFunction<int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_strglob');
+  late final _sqlite3_strglob = _sqlite3_strglobPtr.asFunction<
+      int Function(ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: String LIKE Matching
   ///
@@ -9721,8 +9757,8 @@
   ///
   /// See also: [sqlite3_strglob()].
   int sqlite3_strlike(
-    ffi.Pointer<ffi.Int8> zGlob,
-    ffi.Pointer<ffi.Int8> zStr,
+    ffi.Pointer<pkg_ffi.Char> zGlob,
+    ffi.Pointer<pkg_ffi.Char> zStr,
     int cEsc,
   ) {
     return _sqlite3_strlike(
@@ -9734,10 +9770,13 @@
 
   late final _sqlite3_strlikePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>,
-              ffi.Uint32)>>('sqlite3_strlike');
+          pkg_ffi.Int Function(
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.UnsignedInt)>>('sqlite3_strlike');
   late final _sqlite3_strlike = _sqlite3_strlikePtr.asFunction<
-      int Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>, int)>();
+      int Function(
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<pkg_ffi.Char>, int)>();
 
   /// CAPI3REF: Error Logging Interface
   ///
@@ -9760,7 +9799,7 @@
   /// buffer.
   void sqlite3_log(
     int iErrCode,
-    ffi.Pointer<ffi.Int8> zFormat,
+    ffi.Pointer<pkg_ffi.Char> zFormat,
   ) {
     return _sqlite3_log(
       iErrCode,
@@ -9770,9 +9809,10 @@
 
   late final _sqlite3_logPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Void Function(ffi.Int32, ffi.Pointer<ffi.Int8>)>>('sqlite3_log');
-  late final _sqlite3_log =
-      _sqlite3_logPtr.asFunction<void Function(int, ffi.Pointer<ffi.Int8>)>();
+          ffi.Void Function(
+              pkg_ffi.Int, ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_log');
+  late final _sqlite3_log = _sqlite3_logPtr
+      .asFunction<void Function(int, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Write-Ahead Log Commit Hook
   /// METHOD: sqlite3
@@ -9810,8 +9850,11 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<ffi.Void>, ffi.Pointer<sqlite3>,
-                    ffi.Pointer<ffi.Int8>, ffi.Int32)>>
+                pkg_ffi.Int Function(
+                    ffi.Pointer<ffi.Void>,
+                    ffi.Pointer<sqlite3>,
+                    ffi.Pointer<pkg_ffi.Char>,
+                    pkg_ffi.Int)>>
         arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
@@ -9828,19 +9871,22 @@
               ffi.Pointer<sqlite3>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
                           ffi.Pointer<sqlite3>,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32)>>,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          pkg_ffi.Int)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_wal_hook');
   late final _sqlite3_wal_hook = _sqlite3_wal_hookPtr.asFunction<
       ffi.Pointer<ffi.Void> Function(
           ffi.Pointer<sqlite3>,
           ffi.Pointer<
               ffi.NativeFunction<
-                  ffi.Int32 Function(ffi.Pointer<ffi.Void>,
-                      ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, ffi.Int32)>>,
+                  pkg_ffi.Int Function(
+                      ffi.Pointer<ffi.Void>,
+                      ffi.Pointer<sqlite3>,
+                      ffi.Pointer<pkg_ffi.Char>,
+                      pkg_ffi.Int)>>,
           ffi.Pointer<ffi.Void>)>();
 
   /// CAPI3REF: Configure an auto-checkpoint
@@ -9882,8 +9928,8 @@
 
   late final _sqlite3_wal_autocheckpointPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_wal_autocheckpoint');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              pkg_ffi.Int)>>('sqlite3_wal_autocheckpoint');
   late final _sqlite3_wal_autocheckpoint = _sqlite3_wal_autocheckpointPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -9907,7 +9953,7 @@
   /// complication) of [sqlite3_wal_checkpoint_v2()].
   int sqlite3_wal_checkpoint(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<pkg_ffi.Char> zDb,
   ) {
     return _sqlite3_wal_checkpoint(
       db,
@@ -9917,10 +9963,10 @@
 
   late final _sqlite3_wal_checkpointPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_wal_checkpoint');
-  late final _sqlite3_wal_checkpoint = _sqlite3_wal_checkpointPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_wal_checkpoint');
+  late final _sqlite3_wal_checkpoint = _sqlite3_wal_checkpointPtr.asFunction<
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Checkpoint a database
   /// METHOD: sqlite3
@@ -10014,10 +10060,10 @@
   /// from SQL.
   int sqlite3_wal_checkpoint_v2(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<pkg_ffi.Char> zDb,
     int eMode,
-    ffi.Pointer<ffi.Int32> pnLog,
-    ffi.Pointer<ffi.Int32> pnCkpt,
+    ffi.Pointer<pkg_ffi.Int> pnLog,
+    ffi.Pointer<pkg_ffi.Int> pnCkpt,
   ) {
     return _sqlite3_wal_checkpoint_v2(
       db,
@@ -10030,16 +10076,16 @@
 
   late final _sqlite3_wal_checkpoint_v2Ptr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>>('sqlite3_wal_checkpoint_v2');
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>>('sqlite3_wal_checkpoint_v2');
   late final _sqlite3_wal_checkpoint_v2 =
       _sqlite3_wal_checkpoint_v2Ptr.asFunction<
-          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>, int,
-              ffi.Pointer<ffi.Int32>, ffi.Pointer<ffi.Int32>)>();
+          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>, int,
+              ffi.Pointer<pkg_ffi.Int>, ffi.Pointer<pkg_ffi.Int>)>();
 
   /// CAPI3REF: Virtual Table Interface Configuration
   ///
@@ -10069,8 +10115,8 @@
 
   late final _sqlite3_vtab_configPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3>, ffi.Int32)>>('sqlite3_vtab_config');
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3>, pkg_ffi.Int)>>('sqlite3_vtab_config');
   late final _sqlite3_vtab_config = _sqlite3_vtab_configPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>, int)>();
 
@@ -10091,7 +10137,7 @@
   }
 
   late final _sqlite3_vtab_on_conflictPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_vtab_on_conflict');
   late final _sqlite3_vtab_on_conflict = _sqlite3_vtab_on_conflictPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10120,8 +10166,9 @@
   }
 
   late final _sqlite3_vtab_nochangePtr = _lookup<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_context>)>>(
-      'sqlite3_vtab_nochange');
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_context>)>>('sqlite3_vtab_nochange');
   late final _sqlite3_vtab_nochange = _sqlite3_vtab_nochangePtr
       .asFunction<int Function(ffi.Pointer<sqlite3_context>)>();
 
@@ -10136,7 +10183,7 @@
   /// structure passed to xBestIndex. This function returns a pointer to a buffer
   /// containing the name of the collation sequence for the corresponding
   /// constraint.
-  ffi.Pointer<ffi.Int8> sqlite3_vtab_collation(
+  ffi.Pointer<pkg_ffi.Char> sqlite3_vtab_collation(
     ffi.Pointer<sqlite3_index_info> arg0,
     int arg1,
   ) {
@@ -10148,10 +10195,11 @@
 
   late final _sqlite3_vtab_collationPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_index_info>,
-              ffi.Int32)>>('sqlite3_vtab_collation');
+          ffi.Pointer<pkg_ffi.Char> Function(ffi.Pointer<sqlite3_index_info>,
+              pkg_ffi.Int)>>('sqlite3_vtab_collation');
   late final _sqlite3_vtab_collation = _sqlite3_vtab_collationPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(ffi.Pointer<sqlite3_index_info>, int)>();
+      ffi.Pointer<pkg_ffi.Char> Function(
+          ffi.Pointer<sqlite3_index_info>, int)>();
 
   /// CAPI3REF: Prepared Statement Scan Status
   /// METHOD: sqlite3_stmt
@@ -10198,8 +10246,8 @@
 
   late final _sqlite3_stmt_scanstatusPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_stmt>, ffi.Int32, ffi.Int32,
-              ffi.Pointer<ffi.Void>)>>('sqlite3_stmt_scanstatus');
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_stmt>, pkg_ffi.Int,
+              pkg_ffi.Int, ffi.Pointer<ffi.Void>)>>('sqlite3_stmt_scanstatus');
   late final _sqlite3_stmt_scanstatus = _sqlite3_stmt_scanstatusPtr.asFunction<
       int Function(
           ffi.Pointer<sqlite3_stmt>, int, int, ffi.Pointer<ffi.Void>)>();
@@ -10262,7 +10310,7 @@
   }
 
   late final _sqlite3_db_cacheflushPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_db_cacheflush');
   late final _sqlite3_db_cacheflush = _sqlite3_db_cacheflushPtr
       .asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10284,7 +10332,7 @@
   }
 
   late final _sqlite3_system_errnoPtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3>)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3>)>>(
           'sqlite3_system_errno');
   late final _sqlite3_system_errno =
       _sqlite3_system_errnoPtr.asFunction<int Function(ffi.Pointer<sqlite3>)>();
@@ -10332,7 +10380,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
   int sqlite3_snapshot_get(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<pkg_ffi.Char> zSchema,
     ffi.Pointer<ffi.Pointer<sqlite3_snapshot>> ppSnapshot,
   ) {
     return _sqlite3_snapshot_get(
@@ -10344,11 +10392,13 @@
 
   late final _sqlite3_snapshot_getPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+              pkg_ffi.Int Function(
+                  ffi.Pointer<sqlite3>,
+                  ffi.Pointer<pkg_ffi.Char>,
                   ffi.Pointer<ffi.Pointer<sqlite3_snapshot>>)>>(
       'sqlite3_snapshot_get');
   late final _sqlite3_snapshot_get = _sqlite3_snapshot_getPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<ffi.Pointer<sqlite3_snapshot>>)>();
 
   /// CAPI3REF: Start a read transaction on an historical snapshot
@@ -10394,7 +10444,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
   int sqlite3_snapshot_open(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<pkg_ffi.Char> zSchema,
     ffi.Pointer<sqlite3_snapshot> pSnapshot,
   ) {
     return _sqlite3_snapshot_open(
@@ -10406,10 +10456,10 @@
 
   late final _sqlite3_snapshot_openPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3_snapshot>)>>('sqlite3_snapshot_open');
   late final _sqlite3_snapshot_open = _sqlite3_snapshot_openPtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
           ffi.Pointer<sqlite3_snapshot>)>();
 
   /// CAPI3REF: Destroy a snapshot
@@ -10470,7 +10520,7 @@
 
   late final _sqlite3_snapshot_cmpPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_snapshot>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_snapshot>,
               ffi.Pointer<sqlite3_snapshot>)>>('sqlite3_snapshot_cmp');
   late final _sqlite3_snapshot_cmp = _sqlite3_snapshot_cmpPtr.asFunction<
       int Function(
@@ -10499,7 +10549,7 @@
   /// [SQLITE_ENABLE_SNAPSHOT] option.
   int sqlite3_snapshot_recover(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zDb,
+    ffi.Pointer<pkg_ffi.Char> zDb,
   ) {
     return _sqlite3_snapshot_recover(
       db,
@@ -10509,10 +10559,11 @@
 
   late final _sqlite3_snapshot_recoverPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>)>>('sqlite3_snapshot_recover');
-  late final _sqlite3_snapshot_recover = _sqlite3_snapshot_recoverPtr
-      .asFunction<int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>)>();
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3>,
+              ffi.Pointer<pkg_ffi.Char>)>>('sqlite3_snapshot_recover');
+  late final _sqlite3_snapshot_recover =
+      _sqlite3_snapshot_recoverPtr.asFunction<
+          int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>)>();
 
   /// CAPI3REF: Serialize a database
   ///
@@ -10548,9 +10599,9 @@
   ///
   /// This interface is only available if SQLite is compiled with the
   /// [SQLITE_ENABLE_DESERIALIZE] option.
-  ffi.Pointer<ffi.Uint8> sqlite3_serialize(
+  ffi.Pointer<pkg_ffi.UnsignedChar> sqlite3_serialize(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
+    ffi.Pointer<pkg_ffi.Char> zSchema,
     ffi.Pointer<sqlite3_int64> piSize,
     int mFlags,
   ) {
@@ -10564,14 +10615,14 @@
 
   late final _sqlite3_serializePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Uint8> Function(
+          ffi.Pointer<pkg_ffi.UnsignedChar> Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3_int64>,
-              ffi.Uint32)>>('sqlite3_serialize');
+              pkg_ffi.UnsignedInt)>>('sqlite3_serialize');
   late final _sqlite3_serialize = _sqlite3_serializePtr.asFunction<
-      ffi.Pointer<ffi.Uint8> Function(ffi.Pointer<sqlite3>,
-          ffi.Pointer<ffi.Int8>, ffi.Pointer<sqlite3_int64>, int)>();
+      ffi.Pointer<pkg_ffi.UnsignedChar> Function(ffi.Pointer<sqlite3>,
+          ffi.Pointer<pkg_ffi.Char>, ffi.Pointer<sqlite3_int64>, int)>();
 
   /// CAPI3REF: Deserialize a database
   ///
@@ -10602,8 +10653,8 @@
   /// [SQLITE_ENABLE_DESERIALIZE] option.
   int sqlite3_deserialize(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zSchema,
-    ffi.Pointer<ffi.Uint8> pData,
+    ffi.Pointer<pkg_ffi.Char> zSchema,
+    ffi.Pointer<pkg_ffi.UnsignedChar> pData,
     int szDb,
     int szBuf,
     int mFlags,
@@ -10620,16 +10671,16 @@
 
   late final _sqlite3_deserializePtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Uint8>,
+              ffi.Pointer<pkg_ffi.Char>,
+              ffi.Pointer<pkg_ffi.UnsignedChar>,
               sqlite3_int64,
               sqlite3_int64,
-              ffi.Uint32)>>('sqlite3_deserialize');
+              pkg_ffi.UnsignedInt)>>('sqlite3_deserialize');
   late final _sqlite3_deserialize = _sqlite3_deserializePtr.asFunction<
-      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Uint8>, int, int, int)>();
+      int Function(ffi.Pointer<sqlite3>, ffi.Pointer<pkg_ffi.Char>,
+          ffi.Pointer<pkg_ffi.UnsignedChar>, int, int, int)>();
 
   /// Register a geometry callback named zGeom that can be used as part of an
   /// R-Tree geometry query as follows:
@@ -10637,14 +10688,14 @@
   /// SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zGeom(... params ...)
   int sqlite3_rtree_geometry_callback(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zGeom,
+    ffi.Pointer<pkg_ffi.Char> zGeom,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(
+                pkg_ffi.Int Function(
                     ffi.Pointer<sqlite3_rtree_geometry>,
-                    ffi.Int32,
+                    pkg_ffi.Int,
                     ffi.Pointer<sqlite3_rtree_dbl>,
-                    ffi.Pointer<ffi.Int32>)>>
+                    ffi.Pointer<pkg_ffi.Int>)>>
         xGeom,
     ffi.Pointer<ffi.Void> pContext,
   ) {
@@ -10658,29 +10709,29 @@
 
   late final _sqlite3_rtree_geometry_callbackPtr = _lookup<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<sqlite3_rtree_geometry>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<sqlite3_rtree_dbl>,
-                          ffi.Pointer<ffi.Int32>)>>,
+                          ffi.Pointer<pkg_ffi.Int>)>>,
               ffi.Pointer<ffi.Void>)>>('sqlite3_rtree_geometry_callback');
   late final _sqlite3_rtree_geometry_callback =
       _sqlite3_rtree_geometry_callbackPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<sqlite3_rtree_geometry>,
-                          ffi.Int32,
+                          pkg_ffi.Int,
                           ffi.Pointer<sqlite3_rtree_dbl>,
-                          ffi.Pointer<ffi.Int32>)>>,
+                          ffi.Pointer<pkg_ffi.Int>)>>,
               ffi.Pointer<ffi.Void>)>();
 
   /// Register a 2nd-generation geometry callback named zScore that can be
@@ -10689,10 +10740,10 @@
   /// SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zQueryFunc(... params ...)
   int sqlite3_rtree_query_callback(
     ffi.Pointer<sqlite3> db,
-    ffi.Pointer<ffi.Int8> zQueryFunc,
+    ffi.Pointer<pkg_ffi.Char> zQueryFunc,
     ffi.Pointer<
             ffi.NativeFunction<
-                ffi.Int32 Function(ffi.Pointer<sqlite3_rtree_query_info>)>>
+                pkg_ffi.Int Function(ffi.Pointer<sqlite3_rtree_query_info>)>>
         xQueryFunc,
     ffi.Pointer<ffi.Void> pContext,
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -10709,12 +10760,12 @@
 
   late final _sqlite3_rtree_query_callbackPtr = _lookup<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3>,
-                  ffi.Pointer<ffi.Int8>,
+                  ffi.Pointer<pkg_ffi.Char>,
                   ffi.Pointer<
                       ffi.NativeFunction<
-                          ffi.Int32 Function(
+                          pkg_ffi.Int Function(
                               ffi.Pointer<sqlite3_rtree_query_info>)>>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<
@@ -10725,10 +10776,10 @@
       _sqlite3_rtree_query_callbackPtr.asFunction<
           int Function(
               ffi.Pointer<sqlite3>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<sqlite3_rtree_query_info>)>>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
@@ -10743,100 +10794,7 @@
   external ffi.Pointer<sqlite3_io_methods> pMethods;
 }
 
-class sqlite3_io_methods extends ffi.Struct {
-  @ffi.Int32()
-  external int iVersion;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>> xClose;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, sqlite3_int64)>> xRead;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Void>,
-              ffi.Int32, sqlite3_int64)>> xWrite;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64)>>
-      xTruncate;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xSync;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Pointer<sqlite3_int64>)>>
-      xFileSize;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xLock;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xUnlock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Pointer<ffi.Int32>)>>
-      xCheckReservedLock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Pointer<ffi.Void>)>>
-      xFileControl;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>>
-      xSectorSize;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_file>)>>
-      xDeviceCharacteristics;
-
-  /// Methods above are valid for version 1
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Int32,
-              ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xShmMap;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_file>, ffi.Int32, ffi.Int32, ffi.Int32)>>
-      xShmLock;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<sqlite3_file>)>>
-      xShmBarrier;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, ffi.Int32)>> xShmUnmap;
-
-  /// Methods above are valid for version 2
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64,
-              ffi.Int32, ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xFetch;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_file>, sqlite3_int64,
-              ffi.Pointer<ffi.Void>)>> xUnfetch;
-}
-
-typedef sqlite3_int64 = sqlite_int64;
-typedef sqlite_int64 = ffi.Int64;
+class sqlite3_io_methods extends ffi.Opaque {}
 
 class sqlite3_mutex extends ffi.Opaque {}
 
@@ -10844,68 +10802,72 @@
 
 class sqlite3_vfs extends ffi.Struct {
   /// Structure version number (currently 3)
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iVersion;
 
   /// Size of subclassed sqlite3_file
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int szOsFile;
 
   /// Maximum file pathname length
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int mxPathname;
 
   /// Next registered VFS
   external ffi.Pointer<sqlite3_vfs> pNext;
 
   /// Name of this virtual file system
-  external ffi.Pointer<ffi.Int8> zName;
+  external ffi.Pointer<pkg_ffi.Char> zName;
 
   /// Pointer to application-specific data
   external ffi.Pointer<ffi.Void> pAppData;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_vfs>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<sqlite3_file>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>)>> xOpen;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>, ffi.Int32)>>
-      xDelete;
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>)>> xOpen;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Int32>)>> xAccess;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>,
+              ffi.Pointer<pkg_ffi.Char>, pkg_ffi.Int)>> xDelete;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
-              ffi.Int32, ffi.Pointer<ffi.Int8>)>> xFullPathname;
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_vfs>,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>)>> xAccess;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_vfs>,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>)>> xFullPathname;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>> xDlOpen;
+              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<pkg_ffi.Char>)>> xDlOpen;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Void Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
-      xDlError;
+      ffi.NativeFunction<
+          ffi.Void Function(ffi.Pointer<sqlite3_vfs>, pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>)>> xDlError;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> Function(
               ffi.Pointer<sqlite3_vfs>,
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Int8>)>> xDlSym;
+              ffi.Pointer<pkg_ffi.Char>)>> xDlSym;
 
   external ffi.Pointer<
       ffi.NativeFunction<
@@ -10913,31 +10875,29 @@
               ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Void>)>> xDlClose;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
-      xRandomness;
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>, pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>)>> xRandomness;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Int32)>> xSleep;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>, pkg_ffi.Int)>> xSleep;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Double>)>> xCurrentTime;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Int32, ffi.Pointer<ffi.Int8>)>>
-      xGetLastError;
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>, pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>)>> xGetLastError;
 
   /// The methods above are in version 1 of the sqlite_vfs object
   /// definition.  Those that follow are added in version 2 or later
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3_vfs>, ffi.Pointer<sqlite3_int64>)>>
       xCurrentTimeInt64;
 
@@ -10945,28 +10905,31 @@
   /// Those below are for version 3 and greater.
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>,
-              sqlite3_syscall_ptr)>> xSetSystemCall;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          sqlite3_syscall_ptr Function(
-              ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>> xGetSystemCall;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vfs>,
+              ffi.Pointer<pkg_ffi.Char>, sqlite3_syscall_ptr)>> xSetSystemCall;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Pointer<ffi.Int8> Function(
-                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<ffi.Int8>)>>
+              sqlite3_syscall_ptr Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<pkg_ffi.Char>)>>
+      xGetSystemCall;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Pointer<pkg_ffi.Char> Function(
+                  ffi.Pointer<sqlite3_vfs>, ffi.Pointer<pkg_ffi.Char>)>>
       xNextSystemCall;
 }
 
+typedef sqlite3_int64 = sqlite_int64;
+typedef sqlite_int64 = pkg_ffi.LongLong;
 typedef sqlite3_syscall_ptr
     = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;
 
 class sqlite3_mem_methods extends ffi.Struct {
   /// Memory allocation function
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Int32)>> xMalloc;
+      ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(pkg_ffi.Int)>> xMalloc;
 
   /// Free a prior allocation
   external ffi
@@ -10975,21 +10938,21 @@
 
   /// Resize an allocation
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, ffi.Int32)>>
-      xRealloc;
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Void>, pkg_ffi.Int)>> xRealloc;
 
   /// Return the size of an allocation
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xSize;
+      ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>> xSize;
 
   /// Round up request size to allocation size
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>
+  external ffi.Pointer<ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int)>>
       xRoundup;
 
   /// Initialize the memory allocator
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+      ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>> xInit;
 
   /// Deinitialize the memory allocator
   external ffi
@@ -11001,7 +10964,7 @@
 }
 
 typedef sqlite3_uint64 = sqlite_uint64;
-typedef sqlite_uint64 = ffi.Uint64;
+typedef sqlite_uint64 = pkg_ffi.UnsignedLongLong;
 
 class sqlite3_stmt extends ffi.Opaque {}
 
@@ -11030,11 +10993,11 @@
   external ffi.Pointer<sqlite3_module> pModule;
 
   /// Number of open cursors
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nRef;
 
   /// Error message from sqlite3_mprintf()
-  external ffi.Pointer<ffi.Int8> zErrMsg;
+  external ffi.Pointer<pkg_ffi.Char> zErrMsg;
 }
 
 /// CAPI3REF: Virtual Table Object
@@ -11052,140 +11015,144 @@
 /// of this structure must not change while it is registered with
 /// any database connection.
 class sqlite3_module extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              pkg_ffi.Int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               ffi.Pointer<ffi.Pointer<sqlite3_vtab>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>> xCreate;
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>> xCreate;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              pkg_ffi.Int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
               ffi.Pointer<ffi.Pointer<sqlite3_vtab>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>)>> xConnect;
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>)>> xConnect;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<sqlite3_vtab>, ffi.Pointer<sqlite3_index_info>)>>
       xBestIndex;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
       xDisconnect;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
       xDestroy;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>,
               ffi.Pointer<ffi.Pointer<sqlite3_vtab_cursor>>)>> xOpen;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xClose;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xClose;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_vtab_cursor>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_value>>)>> xFilter;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xNext;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xNext;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xEof;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>)>> xEof;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>,
-              ffi.Pointer<sqlite3_context>, ffi.Int32)>> xColumn;
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>,
+              ffi.Pointer<sqlite3_context>, pkg_ffi.Int)>> xColumn;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab_cursor>,
+          pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab_cursor>,
               ffi.Pointer<sqlite3_int64>)>> xRowid;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_vtab>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<sqlite3_value>>,
               ffi.Pointer<sqlite3_int64>)>> xUpdate;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>> xBegin;
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
+      xBegin;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>> xSync;
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
+      xSync;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
       xCommit;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>)>>
       xRollback;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<sqlite3_vtab>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<
                   ffi.Pointer<
                       ffi.NativeFunction<
                           ffi.Void Function(
                               ffi.Pointer<sqlite3_context>,
-                              ffi.Int32,
+                              pkg_ffi.Int,
                               ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>)>> xFindFunction;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<sqlite3_vtab>, ffi.Pointer<ffi.Int8>)>> xRename;
+          pkg_ffi.Int Function(
+              ffi.Pointer<sqlite3_vtab>, ffi.Pointer<pkg_ffi.Char>)>> xRename;
 
   /// The methods above are in version 1 of the sqlite_module object. Those
   /// below are for version 2 and greater.
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>> xSavepoint;
-
-  external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>> xRelease;
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>, pkg_ffi.Int)>>
+      xSavepoint;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(ffi.Pointer<sqlite3_vtab>, ffi.Int32)>>
+              pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>, pkg_ffi.Int)>>
+      xRelease;
+
+  external ffi.Pointer<
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(ffi.Pointer<sqlite3_vtab>, pkg_ffi.Int)>>
       xRollbackTo;
 
   /// The methods above are in versions 1 and 2 of the sqlite_module object.
   /// Those below are for version 3 and greater.
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Int8>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<pkg_ffi.Char>)>>
       xShadowName;
 }
 
@@ -11291,14 +11258,14 @@
 /// 3009000.
 class sqlite3_index_info extends ffi.Struct {
   /// Number of entries in aConstraint
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nConstraint;
 
   /// Table of WHERE clause constraints
   external ffi.Pointer<sqlite3_index_constraint> aConstraint;
 
   /// Number of terms in the ORDER BY clause
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nOrderBy;
 
   /// The ORDER BY clause
@@ -11307,18 +11274,18 @@
   external ffi.Pointer<sqlite3_index_constraint_usage> aConstraintUsage;
 
   /// Number used to identify the index
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int idxNum;
 
   /// String, possibly obtained from sqlite3_malloc
-  external ffi.Pointer<ffi.Int8> idxStr;
+  external ffi.Pointer<pkg_ffi.Char> idxStr;
 
   /// Free idxStr using sqlite3_free() if true
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int needToFreeIdxStr;
 
   /// True if output is already ordered
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int orderByConsumed;
 
   /// Estimated cost of using this index
@@ -11330,7 +11297,7 @@
   external int estimatedRows;
 
   /// Mask of SQLITE_INDEX_SCAN_* flags
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int idxFlags;
 
   /// Input: Mask of columns used by statement
@@ -11340,40 +11307,40 @@
 
 class sqlite3_index_constraint extends ffi.Struct {
   /// Column constrained.  -1 for ROWID
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iColumn;
 
   /// Constraint operator
-  @ffi.Uint8()
+  @pkg_ffi.UnsignedChar()
   external int op;
 
   /// True if this constraint is usable
-  @ffi.Uint8()
+  @pkg_ffi.UnsignedChar()
   external int usable;
 
   /// Used internally - xBestIndex should ignore
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iTermOffset;
 }
 
 class sqlite3_index_orderby extends ffi.Struct {
   /// Column number
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iColumn;
 
   /// True for DESC.  False for ASC.
-  @ffi.Uint8()
+  @pkg_ffi.UnsignedChar()
   external int desc;
 }
 
 /// Outputs
 class sqlite3_index_constraint_usage extends ffi.Struct {
   /// if >0, constraint is part of argv to xFilter
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int argvIndex;
 
   /// Do not code a test for this constraint
-  @ffi.Uint8()
+  @pkg_ffi.UnsignedChar()
   external int omit;
 }
 
@@ -11400,12 +11367,12 @@
 class sqlite3_blob extends ffi.Opaque {}
 
 class sqlite3_mutex_methods extends ffi.Struct {
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function()>> xMutexInit;
+  external ffi.Pointer<ffi.NativeFunction<pkg_ffi.Int Function()>> xMutexInit;
 
-  external ffi.Pointer<ffi.NativeFunction<ffi.Int32 Function()>> xMutexEnd;
+  external ffi.Pointer<ffi.NativeFunction<pkg_ffi.Int Function()>> xMutexEnd;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(ffi.Int32)>>
+          ffi.NativeFunction<ffi.Pointer<sqlite3_mutex> Function(pkg_ffi.Int)>>
       xMutexAlloc;
 
   external ffi.Pointer<
@@ -11417,7 +11384,7 @@
       xMutexEnter;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexTry;
 
   external ffi.Pointer<
@@ -11425,11 +11392,11 @@
       xMutexLeave;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexHeld;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_mutex>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_mutex>)>>
       xMutexNotheld;
 }
 
@@ -11446,13 +11413,13 @@
 }
 
 class sqlite3_pcache_methods2 extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<ffi.Void> pArg;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+      ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>> xInit;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -11461,39 +11428,39 @@
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<sqlite3_pcache> Function(
-              ffi.Int32, ffi.Int32, ffi.Int32)>> xCreate;
+              pkg_ffi.Int, pkg_ffi.Int, pkg_ffi.Int)>> xCreate;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int32)>>
+              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, pkg_ffi.Int)>>
       xCachesize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_pcache>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_pcache>)>>
       xPagecount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Pointer<sqlite3_pcache_page> Function(
-              ffi.Pointer<sqlite3_pcache>, ffi.Uint32, ffi.Int32)>> xFetch;
+          ffi.Pointer<sqlite3_pcache_page> Function(ffi.Pointer<sqlite3_pcache>,
+              pkg_ffi.UnsignedInt, pkg_ffi.Int)>> xFetch;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_pcache>,
-              ffi.Pointer<sqlite3_pcache_page>, ffi.Int32)>> xUnpin;
+              ffi.Pointer<sqlite3_pcache_page>, pkg_ffi.Int)>> xUnpin;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<sqlite3_pcache>,
               ffi.Pointer<sqlite3_pcache_page>,
-              ffi.Uint32,
-              ffi.Uint32)>> xRekey;
+              pkg_ffi.UnsignedInt,
+              pkg_ffi.UnsignedInt)>> xRekey;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Uint32)>>
-      xTruncate;
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<sqlite3_pcache>, pkg_ffi.UnsignedInt)>> xTruncate;
 
   external ffi.Pointer<
           ffi.NativeFunction<ffi.Void Function(ffi.Pointer<sqlite3_pcache>)>>
@@ -11508,44 +11475,45 @@
   external ffi.Pointer<ffi.Void> pArg;
 
   external ffi.Pointer<
-      ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Void>)>> xInit;
+      ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<ffi.Void>)>> xInit;
 
   external ffi
           .Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
       xShutdown;
 
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Pointer<sqlite3_pcache> Function(ffi.Int32, ffi.Int32)>> xCreate;
+          ffi.NativeFunction<
+              ffi.Pointer<sqlite3_pcache> Function(pkg_ffi.Int, pkg_ffi.Int)>>
+      xCreate;
 
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Int32)>>
+              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, pkg_ffi.Int)>>
       xCachesize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<sqlite3_pcache>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<sqlite3_pcache>)>>
       xPagecount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<sqlite3_pcache>, ffi.Uint32, ffi.Int32)>> xFetch;
+          ffi.Pointer<ffi.Void> Function(ffi.Pointer<sqlite3_pcache>,
+              pkg_ffi.UnsignedInt, pkg_ffi.Int)>> xFetch;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>,
-              ffi.Int32)>> xUnpin;
+              pkg_ffi.Int)>> xUnpin;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Pointer<ffi.Void>,
-              ffi.Uint32, ffi.Uint32)>> xRekey;
+              pkg_ffi.UnsignedInt, pkg_ffi.UnsignedInt)>> xRekey;
 
   external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Void Function(ffi.Pointer<sqlite3_pcache>, ffi.Uint32)>>
-      xTruncate;
+      ffi.NativeFunction<
+          ffi.Void Function(
+              ffi.Pointer<sqlite3_pcache>, pkg_ffi.UnsignedInt)>> xTruncate;
 
   external ffi.Pointer<
           ffi.NativeFunction<ffi.Void Function(ffi.Pointer<sqlite3_pcache>)>>
@@ -11574,7 +11542,7 @@
 /// the most recent version.
 class sqlite3_snapshot extends ffi.Struct {
   @ffi.Array.multi([48])
-  external ffi.Array<ffi.Uint8> hidden;
+  external ffi.Array<pkg_ffi.UnsignedChar> hidden;
 }
 
 /// A pointer to a structure of the following type is passed as the first
@@ -11584,7 +11552,7 @@
   external ffi.Pointer<ffi.Void> pContext;
 
   /// Size of array aParam[]
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nParam;
 
   /// Parameters passed to SQL geom function
@@ -11613,7 +11581,7 @@
   external ffi.Pointer<ffi.Void> pContext;
 
   /// Number of function parameters
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nParam;
 
   /// value of function parameters
@@ -11631,18 +11599,18 @@
   external ffi.Pointer<sqlite3_rtree_dbl> aCoord;
 
   /// Number of pending entries in the queue
-  external ffi.Pointer<ffi.Uint32> anQueue;
+  external ffi.Pointer<pkg_ffi.UnsignedInt> anQueue;
 
   /// Number of coordinates
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int nCoord;
 
   /// Level of current node or entry
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iLevel;
 
   /// The largest iLevel value in the tree
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int mxLevel;
 
   /// Rowid for current entry
@@ -11654,11 +11622,11 @@
   external double rParentScore;
 
   /// Visibility of parent node
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int eParentWithin;
 
   /// OUT: Visibility
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int eWithin;
 
   /// OUT: Write the score here
@@ -11880,7 +11848,7 @@
 /// See xPhraseFirstColumn above.
 class Fts5ExtensionApi extends ffi.Struct {
   /// Currently always set to 3
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iVersion;
 
   external ffi.Pointer<
@@ -11888,57 +11856,58 @@
           ffi.Pointer<ffi.Void> Function(ffi.Pointer<Fts5Context>)>> xUserData;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<Fts5Context>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<Fts5Context>)>>
       xColumnCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>, ffi.Pointer<sqlite3_int64>)>> xRowCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<Fts5Context>, ffi.Int32,
+          pkg_ffi.Int Function(ffi.Pointer<Fts5Context>, pkg_ffi.Int,
               ffi.Pointer<sqlite3_int64>)>> xColumnTotalSize;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32,
-                          ffi.Int32,
-                          ffi.Int32)>>)>> xTokenize;
+                          pkg_ffi.Int,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          pkg_ffi.Int,
+                          pkg_ffi.Int,
+                          pkg_ffi.Int)>>)>> xTokenize;
 
   external ffi.Pointer<
-          ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<Fts5Context>)>>
+          ffi.NativeFunction<pkg_ffi.Int Function(ffi.Pointer<Fts5Context>)>>
       xPhraseCount;
 
   external ffi.Pointer<
-      ffi.NativeFunction<
-          ffi.Int32 Function(ffi.Pointer<Fts5Context>, ffi.Int32)>> xPhraseSize;
+          ffi.NativeFunction<
+              pkg_ffi.Int Function(ffi.Pointer<Fts5Context>, pkg_ffi.Int)>>
+      xPhraseSize;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
-              ffi.Pointer<Fts5Context>, ffi.Pointer<ffi.Int32>)>> xInstCount;
+          pkg_ffi.Int Function(
+              ffi.Pointer<Fts5Context>, ffi.Pointer<pkg_ffi.Int>)>> xInstCount;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xInst;
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>> xInst;
 
   external ffi.Pointer<
           ffi.NativeFunction<sqlite3_int64 Function(ffi.Pointer<Fts5Context>)>>
@@ -11946,34 +11915,33 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Int32>)>> xColumnText;
-
-  external ffi.Pointer<
-          ffi.NativeFunction<
-              ffi.Int32 Function(
-                  ffi.Pointer<Fts5Context>, ffi.Int32, ffi.Pointer<ffi.Int32>)>>
-      xColumnSize;
+              pkg_ffi.Int,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              ffi.Pointer<pkg_ffi.Int>)>> xColumnText;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(ffi.Pointer<Fts5Context>, pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Int>)>> xColumnSize;
+
+  external ffi.Pointer<
+      ffi.NativeFunction<
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<Fts5ExtensionApi>,
                           ffi.Pointer<Fts5Context>,
                           ffi.Pointer<ffi.Void>)>>)>> xQueryPhrase;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<ffi.Void>,
               ffi.Pointer<
@@ -11983,47 +11951,47 @@
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Pointer<ffi.Void> Function(
-              ffi.Pointer<Fts5Context>, ffi.Int32)>> xGetAuxdata;
+              ffi.Pointer<Fts5Context>, pkg_ffi.Int)>> xGetAuxdata;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseFirst;
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>> xPhraseFirst;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseNext;
+              ffi.Pointer<pkg_ffi.Int>,
+              ffi.Pointer<pkg_ffi.Int>)>> xPhraseNext;
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Context>,
-              ffi.Int32,
+              pkg_ffi.Int,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseFirstColumn;
+              ffi.Pointer<pkg_ffi.Int>)>> xPhraseFirstColumn;
 
   external ffi.Pointer<
       ffi.NativeFunction<
           ffi.Void Function(
               ffi.Pointer<Fts5Context>,
               ffi.Pointer<Fts5PhraseIter>,
-              ffi.Pointer<ffi.Int32>)>> xPhraseNextColumn;
+              ffi.Pointer<pkg_ffi.Int>)>> xPhraseNextColumn;
 }
 
 class Fts5Context extends ffi.Opaque {}
 
 class Fts5PhraseIter extends ffi.Struct {
-  external ffi.Pointer<ffi.Uint8> a;
+  external ffi.Pointer<pkg_ffi.UnsignedChar> a;
 
-  external ffi.Pointer<ffi.Uint8> b;
+  external ffi.Pointer<pkg_ffi.UnsignedChar> b;
 }
 
 class Fts5Tokenizer extends ffi.Opaque {}
@@ -12031,10 +11999,10 @@
 class fts5_tokenizer extends ffi.Struct {
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<ffi.Void>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Int32,
+              ffi.Pointer<ffi.Pointer<pkg_ffi.Char>>,
+              pkg_ffi.Int,
               ffi.Pointer<ffi.Pointer<Fts5Tokenizer>>)>> xCreate;
 
   external ffi.Pointer<
@@ -12043,34 +12011,34 @@
 
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<Fts5Tokenizer>,
               ffi.Pointer<ffi.Void>,
-              ffi.Int32,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Int32,
+              pkg_ffi.Int,
+              ffi.Pointer<pkg_ffi.Char>,
+              pkg_ffi.Int,
               ffi.Pointer<
                   ffi.NativeFunction<
-                      ffi.Int32 Function(
+                      pkg_ffi.Int Function(
                           ffi.Pointer<ffi.Void>,
-                          ffi.Int32,
-                          ffi.Pointer<ffi.Int8>,
-                          ffi.Int32,
-                          ffi.Int32,
-                          ffi.Int32)>>)>> xTokenize;
+                          pkg_ffi.Int,
+                          ffi.Pointer<pkg_ffi.Char>,
+                          pkg_ffi.Int,
+                          pkg_ffi.Int,
+                          pkg_ffi.Int)>>)>> xTokenize;
 }
 
 class fts5_api extends ffi.Struct {
   /// Currently always set to 2
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int iVersion;
 
   /// Create a new tokenizer
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<fts5_api>,
-                  ffi.Pointer<ffi.Int8>,
+                  ffi.Pointer<pkg_ffi.Char>,
                   ffi.Pointer<ffi.Void>,
                   ffi.Pointer<fts5_tokenizer>,
                   ffi.Pointer<
@@ -12081,18 +12049,18 @@
   /// Find an existing tokenizer
   external ffi.Pointer<
       ffi.NativeFunction<
-          ffi.Int32 Function(
+          pkg_ffi.Int Function(
               ffi.Pointer<fts5_api>,
-              ffi.Pointer<ffi.Int8>,
+              ffi.Pointer<pkg_ffi.Char>,
               ffi.Pointer<ffi.Pointer<ffi.Void>>,
               ffi.Pointer<fts5_tokenizer>)>> xFindTokenizer;
 
   /// Create a new auxiliary function
   external ffi.Pointer<
           ffi.NativeFunction<
-              ffi.Int32 Function(
+              pkg_ffi.Int Function(
                   ffi.Pointer<fts5_api>,
-                  ffi.Pointer<ffi.Int8>,
+                  ffi.Pointer<pkg_ffi.Char>,
                   ffi.Pointer<ffi.Void>,
                   fts5_extension_function,
                   ffi.Pointer<
@@ -12107,7 +12075,7 @@
             ffi.Pointer<Fts5ExtensionApi>,
             ffi.Pointer<Fts5Context>,
             ffi.Pointer<sqlite3_context>,
-            ffi.Int32,
+            pkg_ffi.Int,
             ffi.Pointer<ffi.Pointer<sqlite3_value>>)>>;
 
 const String SQLITE_VERSION = '3.32.3';
diff --git a/pkgs/ffigen/test/large_integration_tests/large_test.dart b/pkgs/ffigen/test/large_integration_tests/large_test.dart
index a3fadae..14c54bf 100644
--- a/pkgs/ffigen/test/large_integration_tests/large_test.dart
+++ b/pkgs/ffigen/test/large_integration_tests/large_test.dart
@@ -37,9 +37,16 @@
     - '**Documentation.h'
     - '**FataErrorHandler.h'
     - '**Index.h'
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
-  'time_t': 'Int64'
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'size_t':
+      lib: 'pkg_ffi'
+      c-type: 'Size'
+      dart-type: 'int'
+    'time_t':
+      lib: 'ffi'
+      c-type: 'Int64'
+      dart-type: 'int'
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types, non_constant_identifier_names
       ''') as YamlMap);
@@ -64,8 +71,12 @@
     - third_party/cjson_library/cJSON.h
   ${strings.includeDirectives}:
     - '**cJSON.h'
-${strings.typedefmap}:
-  'size_t': 'IntPtr'
+${strings.typeMap}:
+  ${strings.typeMapTypedefs}:
+    'size_t':
+      lib: 'pkg_ffi'
+      c-type: 'Size'
+      dart-type: 'int'
 ${strings.preamble}: |
   // ignore_for_file: camel_case_types, non_constant_identifier_names
       ''') as YamlMap);
diff --git a/pkgs/ffigen/test/native_test/native_test_bindings.dart b/pkgs/ffigen/test/native_test/native_test_bindings.dart
index 8c4d0ea..70e8775 100644
--- a/pkgs/ffigen/test/native_test/native_test_bindings.dart
+++ b/pkgs/ffigen/test/native_test/native_test_bindings.dart
@@ -4,6 +4,7 @@
 //
 // Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
+import 'package:ffi/ffi.dart' as pkg_ffi;
 
 /// Native tests.
 class NativeLibrary {
@@ -211,8 +212,8 @@
 
   late final _Function1StructReturnByValuePtr = _lookup<
       ffi.NativeFunction<
-          Struct3 Function(ffi.Int32, ffi.Int32,
-              ffi.Int32)>>('Function1StructReturnByValue');
+          Struct3 Function(pkg_ffi.Int, pkg_ffi.Int,
+              pkg_ffi.Int)>>('Function1StructReturnByValue');
   late final _Function1StructReturnByValue = _Function1StructReturnByValuePtr
       .asFunction<Struct3 Function(int, int, int)>();
 
@@ -225,7 +226,7 @@
   }
 
   late final _Function1StructPassByValuePtr =
-      _lookup<ffi.NativeFunction<ffi.Int32 Function(Struct3)>>(
+      _lookup<ffi.NativeFunction<pkg_ffi.Int Function(Struct3)>>(
           'Function1StructPassByValue');
   late final _Function1StructPassByValue =
       _Function1StructPassByValuePtr.asFunction<int Function(Struct3)>();
@@ -240,12 +241,12 @@
 }
 
 class Struct3 extends ffi.Struct {
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int a;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int b;
 
-  @ffi.Int32()
+  @pkg_ffi.Int()
   external int c;
 }
diff --git a/pkgs/ffigen/test/rename_tests/rename_test.dart b/pkgs/ffigen/test/rename_tests/rename_test.dart
index f362a11..896b3db 100644
--- a/pkgs/ffigen/test/rename_tests/rename_test.dart
+++ b/pkgs/ffigen/test/rename_tests/rename_test.dart
@@ -215,15 +215,15 @@
         parameters: [
           Parameter(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: Type.importedType(intType),
           ),
           Parameter(
             name: 'fullMatchSuccess',
-            type: Type.nativeType(SupportedNativeType.Float),
+            type: Type.importedType(floatType),
           ),
           Parameter(
             name: 'unnamed',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: Type.importedType(intType),
           ),
         ],
       ),
@@ -250,11 +250,11 @@
         members: [
           Member(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: Type.importedType(intType),
           ),
           Member(
             name: 'fullMatchSuccess',
-            type: Type.nativeType(SupportedNativeType.Float),
+            type: Type.importedType(floatType),
           ),
         ],
       ),
@@ -263,7 +263,7 @@
         members: [
           Member(
             name: 'underscore',
-            type: Type.nativeType(SupportedNativeType.Int32),
+            type: Type.importedType(intType),
           ),
         ],
       ),
diff --git a/pkgs/ffigen/test/test_utils.dart b/pkgs/ffigen/test/test_utils.dart
index a967f66..624e626 100644
--- a/pkgs/ffigen/test/test_utils.dart
+++ b/pkgs/ffigen/test/test_utils.dart
@@ -70,3 +70,10 @@
     print('${record.level.name.padRight(8)}: ${record.message}');
   });
 }
+
+void logWarningsToArray(List<String> logArr, [Level level = Level.WARNING]) {
+  Logger.root.level = level;
+  Logger.root.onRecord.listen((record) {
+    logArr.add('${record.level.name.padRight(8)}: ${record.message}');
+  });
+}
