commit | 5ec9e685cc4dce485327b7eadf1b1bb43e89b217 | [log] [tgz] |
---|---|---|
author | Prerak Mann <31154435+mannprerak2@users.noreply.github.com> | Mon Jul 27 15:42:45 2020 +0530 |
committer | GitHub <noreply@github.com> | Mon Jul 27 12:12:45 2020 +0200 |
tree | 8630faa23f603b7379c3fb86117b4bd9aa8b5640 | |
parent | 55a194a6bfb6e5c1c79bdd557460d6c0c7bcc2a9 [diff] |
Update config specification for Comments (#48) Closes #38 - Comments config now has a style and length sub keys - `style: doxygen(default) | any`, `length: brief | full(default)`, and can be disabled by passing `comments: false`. - Updated comment type in config. - Updated readme to use `code` tag inside `pre` tag in config options.
Experimental binding generator for FFI bindings.
For some header file example.h:
int sum(int a, int b);
Add configurations to Pubspec File:
ffigen: output: 'generated_bindings.dart' headers: - 'example.h'
Output (generated_bindings.dart).
class NativeLibrary { final DynamicLibrary _dylib; NativeLibrary(DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary; int sum(int a, int b) { _sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum'); return _sum(a, b); } _dart_sum _sum;; } typedef _c_sum = ffi.Int32 Function(Int32 a, Int32 b); typedef _dart_sum = int Function(int a,int b);
pubspec.yaml
.pubspec.yaml
or in a custom YAML file (see configurations).pub run ffigen
.package:ffigen
uses LLVM. Install LLVM in the following way.
sudo apt-get install libclang-dev
.winget install -e --id LLVM.LLVM
.brew install llvm
.Configurations can be provided in 2 ways-
pubspec.yaml
file under the key ffigen
.pub run ffigen --config config.yaml
The following configuration options are available-
Fixed size array‘s in structs aren’t currently supported by Dart. However we provide a workaround, using which array items can now be accessed using []
operator.
Here's a C structure from libclang-
typedef struct { unsigned long long data[3]; } CXFileUniqueID;
The generated code is -
class CXFileUniqueID extends ffi.Struct { @ffi.Uint64() int _unique_data_item_0; @ffi.Uint64() int _unique_data_item_1; @ffi.Uint64() int _unique_data_item_2; /// Helper for array `data`. ArrayHelper_CXFileUniqueID_data_level0 get data => ArrayHelper_CXFileUniqueID_data_level0(this, [3], 0, 0); } /// Helper for array `data` in struct `CXFileUniqueID`. class ArrayHelper_CXFileUniqueID_data_level0 { final CXFileUniqueID _struct; final List<int> dimensions; final int level; final int _absoluteIndex; int get length => dimensions[level]; ArrayHelper_CXFileUniqueID_data_level0( this._struct, this.dimensions, this.level, this._absoluteIndex); void _checkBounds(int index) { if (index >= length || index < 0) { throw RangeError( 'Dimension $level: index not in range 0..${length} exclusive.'); } } int operator [](int index) { _checkBounds(index); switch (_absoluteIndex + index) { case 0: return _struct._unique_data_item_0; case 1: return _struct._unique_data_item_1; case 2: return _struct._unique_data_item_2; default: throw Exception('Invalid Array Helper generated.'); } } void operator []=(int index, int value) { _checkBounds(index); switch (_absoluteIndex + index) { case 0: _struct._unique_data_item_0 = value; break; case 1: _struct._unique_data_item_1 = value; break; case 2: _struct._unique_data_item_2 = value; break; default: throw Exception('Invalid Array Helper generated.'); } } }
cd examples/<example_u_want_to_run>
, Run pub get
.pub run ffigen
.pub run ffigen:setup
.cd test/native_test
.dart build_test_dylib.dart
.Run tests from the root of the package with pub run test
.