Флаттер сбои при использовании Evolis Android SDK с FFIAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Флаттер сбои при использовании Evolis Android SDK с FFI

Сообщение Anonymous »

Это очень специфический вопрос, но я больше не знаю, где искать.
evlois предоставляет SDK для Android в виде файлов .so.
https://sdk.evolis.com/doc/doc-c/index.html
https://sdk.evolis.com/doc/doc-c/evolis_8h.html
Я добавил файлы в правильные папки в моем каталоге Android и сгенерировал класс привязки Dart через ffigen. Так что я могу получить доступ к SDK. Это также работает для функции «evolis_version». Это дает мне версию 9.0.2.6484. Я не поймаю исключение, это просто сбои. Я могу найти функцию, так что она существует. < /P>
F/libc (22120): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 22155 (1.ui), pid 22120 (systems.test_app)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'SUNMI/V3_MIX_EDLA_GL/V3_MIX:13/TKQ1.230110.001/40:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2025-02-19 14:58:37.674946211+0100
Process uptime: 36s
Cmdline: de.organisation.test_app
pid: 22120, tid: 22155, name: 1.ui >>> de.organisation.test_app
На данный момент я не знаю, что еще Могу я проверить. Кто -то здесь, кто знает, как получить доступ к этому SDK? < /P>
% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.27.2, on macOS 15.1.1 24B91 darwin-arm64, locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.1)
[!] Xcode - develop for iOS and macOS (Xcode 16.1)
✗ Unable to get list of installed Simulator runtimes.
✗ CocoaPods not installed.
CocoaPods is a package manager for iOS or macOS platform code.
Without CocoaPods, plugins will not work on iOS or macOS.
For more info, see https://flutter.dev/to/platform-plugins
For installation instructions, see https://guides.cocoapods.org/using/gett ... stallation
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2024.1.7)
[✓] VS Code (version 1.97.2)
[✓] Connected device (4 available)
[✓] Network resources

< /code>
Вот как я называю функцию: < /p>
import 'dart:ffi' as ffi;
import 'dart:io';

import 'package:ffi/ffi.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:pos_app/ffi_libs/generated_evolis_bindings.dart';
import 'package:pos_app/utility/widgets/space.dart';

class EvoilsTestPage extends StatefulWidget {
const EvoilsTestPage({super.key});

@override
State createState() => _EvoilsTestPageState();
}

class _EvoilsTestPageState extends State {
late final EvolisBindings evoBinding;
String status = 'ready';

@override
void initState() {
if (!kIsWeb) {
final dynamicLibrary = Platform.isAndroid
? ffi.DynamicLibrary.open('libevolis.so')
: ffi.DynamicLibrary.process();
evoBinding = EvolisBindings(dynamicLibrary);
}
super.initState();
}

updateStatus(String status) {
print(status);
setState(() {
this.status = status;
});
}

_getEvoVersion() {
try {
final versionPtr = evoBinding.evolis_version();
String version = versionPtr.cast().toDartString();
updateStatus("evo version: $version");
} catch (e) {
updateStatus("evolis_version function NOT found: $e");
}
}

_lookUpFunction() {
String functionName = "evolis_open";
try {
updateStatus("start Print");
updateStatus("openPrinter");
final openFunc = evoBinding.lookup("evolis_open");
updateStatus('$functionName: ${openFunc.toString()}');
return;
} catch (e) {
updateStatus('$functionName does not seem to exist:\n\n${e.toString()}');
}
}

_testPrint() async {
ffi.Pointer namePtr = ffi.nullptr;
try {
String dartString = 'Evolis Primacy 2';
namePtr = dartString.toNativeUtf8().cast();

final printerPtr = evoBinding.evolis_open(namePtr);

if (printerPtr.address == 0) {
updateStatus("Failed to open printer.");
} else {
updateStatus(
"Printer opened successfully. ${printerPtr.toString()}");
}
print("closePrinter");
evoBinding.evolis_close(printerPtr);
print("free pointer");
malloc.free(namePtr);
} catch (e) {
malloc.free(namePtr);
updateStatus(e.toString());
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Evolis Printer Test")),
body: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(status),
Space.p40(),
ElevatedButton(
onPressed: () => _testPrint(),
child: Text("Test Print"),
),
ElevatedButton(
onPressed: _getEvoVersion,
child: Text("Evo Version"),
),
ElevatedButton(
onPressed: _lookUpFunction,
child: Text("Lookup Function"),
),
],
),
),
);
}
}

< /code>
Я не буду бросать здесь сгенерированный класс, потому что это 14495 строк. Но вот важные функции вызов < /p>
import 'dart:ffi' as ffi;

class EvolisBindings {
/// Holds the symbol lookup function.
final ffi.Pointer Function(String symbolName)
lookup;

/// The symbols are looked up in [dynamicLibrary].
EvolisBindings(ffi.DynamicLibrary dynamicLibrary)
: lookup = dynamicLibrary.lookup;

/// The symbols are looked up with [lookup].
EvolisBindings.fromLookup(
ffi.Pointer Function(String symbolName)
lookup)
: lookup = lookup;

/// Connect to the printer referenced by the `name` argument.
/// Same as evolis_open_with_mode(a, EVOLIS_OM_AUTO)
ffi.Pointer evolis_open(
ffi.Pointer name,
) {
return _evolis_open(
name,
);
}

late final _evolis_openPtr = lookup<
ffi.NativeFunction<
ffi.Pointer Function(
ffi.Pointer)>>('evolis_open');
late final _evolis_open = _evolis_openPtr
.asFunction();

/// Get library version at runtime.
ffi.Pointer evolis_version() {
return _evolis_version();
}

late final _evolis_versionPtr =
lookup(
'evolis_version');
late final _evolis_version =
_evolis_versionPtr.asFunction();

}


Подробнее здесь: https://stackoverflow.com/questions/794 ... k-with-ffi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»