Flutter, используйте DynamicLibrary.open () для предварительной сборки библиотеки GO .so без необходимости писать собственный код (Java / Swift) - PullRequest
4 голосов
/ 11 октября 2019

Я создал библиотеку GO и собрал ее как библиотеку .so. Работает загрузка библиотеки в Java с System.loadLibrary(), но я не могу управлять ей для загрузки непосредственно из флаттера / дротика с использованием DynamicLibrary.open().

Я хочу пропустить процесс вызова нативного кода и загрузить общие библиотеки непосредственно во флаттере.

DynamicLibrary.open доступно только на канале разработчиков v1.10.14.

Документация с примерами с использованием Cmake: https://flutter.dev/docs/development/platform-integration/c-interop

Мой код:

static final DynamicLibrary nativeAddLib = DynamicLibrary.open("lib-mylib.so");
final int Function (String ifName, int tunFd, String settings) addStuff = nativeAddLib.lookup<NativeFunction<Int32 Function(String, Int32, String)>>("addStuff").asFunction();

Ошибка:

Compiler message:
lib/vpn_connection/vpn_connection_bloc.dart:20:164: Error: Expected type 'NativeFunction<Int32 Function(String, Int32, String)>' to be a valid   and instantiated subtype of 'NativeType'.
- 'NativeFunction' is from 'dart:ffi'.
- 'Int32' is from 'dart:ffi'.
final int Function (String ifName, int tunFd, String settings) addStuff = nativeAddLib.lookup<NativeFunction<Int32 Function(String, Int32, String)>>("addStuff").asFunction();
                                                                                                                                                                 ^
Exception: Errors during snapshot creation: null
#0      KernelSnapshot.build (package:flutter_tools/src/build_system  /targets/dart.dart:226:7)
<asynchronous suspension>
#1      _BuildInstance._invokeInternal (package:flutter_tools/src/build_system/build_system.dart:526:25)
<asynchronous suspension>
#2      _BuildInstance.invokeTarget.<anonymous closure>   (package:flutter_tools/src/build_system/build_system.dart:481:35)
#3      new Future.sync (dart:async/future.dart:224:31)
#4      AsyncMemoizer.runOnce (package:async/src/async_memoizer.dart:43:45)
#5      _BuildInstance.invokeTarget (package:flutter_tools/src/build_system/build_system.dart:481:21)

Похоже, не находит файл / функцию.

Мой Gradle:

android {
compileSdkVersion 28

lintOptions {
    disable 'InvalidPackage'
}

sourceSets.main {
    jniLibs.srcDirs += files(extraJniDirectory)
}

defaultConfig {
    applicationId "com.custom.android"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    ndk {
        abiFilters "armeabi", "x86", "armeabi-v7a", "arm64-v8a", "x86_64"
    }
}

buildTypes {
    release {
        signingConfig signingConfigs.debug

        ndk {
            if (project.hasProperty('target-platform') &&
                    project.property('target-platform') == 'android-arm64') {
                abiFilters 'arm64-v8a'
            } else {
                abiFilters 'armeabi-v7a'
            }
        }
    }
}
}

Обновление:

Я создал .so файл с CMake, как в примере флаттера, я извлекаю его изapk и положил его в ту же папку с моим файлом go build .so, и он работает, но я не могу понять, почему мой первый файл .so не работает с флаттером, а работает с android.

Update2:

DynamicLibrary.open("lib-mylib.so") загружено, nativeAddLib.lookup<NativeFunction<Int32 Function(String, Int32, String)>>("addStuff") возвращает указатель, это означает, что функция найдена, но при вызове .asFunction() она прерывается.

Упрощая код:

var addStuff = nativeAddLib.lookup("addStuff").asFunction();

я получаю ошибку:

Error: Expected type 'NativeType' to be a valid and instantiated subtype of 'NativeType'.
- 'NativeType' is from 'dart:ffi'.

1 Ответ

4 голосов
/ 16 октября 2019

Я думаю, что проблема может заключаться в том, что FFI Дартса напрямую не поддерживает строки. Взгляните на этот пример, чтобы найти путь к маршалу строк с помощью отдельного пакета ffi: https://github.com/dart-lang/samples/blob/master/ffi/system-command/linux.dart

...