#android #flutter #brother-print-sdk
Вопрос:
Я разрабатываю приложение для Android, используя Flutter и собственный SDK для принтера Brother. Я использую методканал для связи между активностью Flutter и основной активностью. Это мой код для печати этикеток с помощью принтера Brother QL-810W:
MainActivity.java
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "brother/print";
public static Printer printer;
protected PrinterInfo settings;
protected PrinterStatus bit;
@Override
public void configureFlutterEngine (@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
GeneratedPluginRegistrant.registerWith(flutterEngine);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("print")) {
String address = call.argument("address");
String base64 = call.argument("base64");
int lblCount = 1; //call.argument("labels");
// Specify printer
printer = new Printer();
settings = new PrinterInfo();
settings = printer.getPrinterInfo();
settings.workPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/BrotherPrinter";
settings.printerModel = PrinterInfo.Model.QL_810W;
settings.port = PrinterInfo.Port.NET;
settings.ipAddress = address;
// Print Settings
settings.paperSize = PrinterInfo.PaperSize.CUSTOM;
settings.orientation = PrinterInfo.Orientation.LANDSCAPE;
settings.valign = PrinterInfo.VAlign.MIDDLE;
settings.align = PrinterInfo.Align.CENTER;
settings.printMode = PrinterInfo.PrintMode.FIT_TO_PAGE;
settings.numberOfCopies = lblCount;
//settings.labelNameIndex = LabelInfo.QL700.W62.ordinal();
settings.labelNameIndex = LabelInfo.QL700.W62RB.ordinal();
settings.isAutoCut = true;
settings.isCutAtEnd = false;
settings.isHalfCut = false;
settings.isSpecialTape = false;
printer.setPrinterInfo(settings);
if (printer.startCommunication()) {
bit = new PrinterStatus();
bit = printer.printImage(bmpFromBase64(base64));
if (bit.errorCode != PrinterInfo.ErrorCode.ERROR_NONE) {
Log.d("TAG", "ERROR - " bit.errorCode);
result.error("ERROR",bit.errorCode.toString(),"Error when Printing");
Toast.makeText(this, "Error at printer: " bit.errorCode.toString(), Toast.LENGTH_SHORT).show();
}
printer.endCommunication();
result.success(0);
}
}else{
result.notImplemented();
}
});
}
public static Bitmap bmpFromBase64(String base64){
try{
byte[] bytes = Base64.decode(base64, Base64.DEFAULT);
InputStream stream = new ByteArrayInputStream(bytes);
return BitmapFactory.decodeStream(stream);
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
Я получаю следующую ошибку при тестировании своего приложения.
Build fingerprint: 'Nokia/Onyx_00WW/B2N_sprout:10/QKQ1.190828.002/00WW_4_15N:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2021-10-07 18:28:33 0200
pid: 18121, tid: 18121, name: fhs_date_labels >>> com.abi_selvaraj.fhs_date_labels <<<
uid: 10241
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring
in call to GetStringUTFChars
from boolean com.brother.ptouch.sdk.JNIWrapper.writeByteInFile(int[], int, java.lang.String, boolean)'
x0 0000000000000000 x1 00000000000046c9 x2 0000000000000006 x3 0000007fcd9c8270
x4 fefeff7213592f97 x5 fefeff7213592f97 x6 fefeff7213592f97 x7 7f7f7f7f7f7f7fff
x8 00000000000000f0 x9 dd7c75978bd06d95 x10 0000000000000001 x11 0000000000000000
x12 fffffff0fffffbdf x13 ffffffffffffffff x14 0000000000000000 x15 ffffffffffffffff
x16 0000007315fe78c0 x17 0000007315fc3900 x18 00000072172da558 x19 00000000000046c9
x20 00000000000046c9 x21 00000000ffffffff x22 00000072825f1760 x23 00000072926ad705
x24 00000072926cf1f5 x25 0000000000000001 x26 00000072925bc258 x27 0000007318a06820
x28 0000007292bd9338 x29 0000007fcd9c8310
sp 0000007fcd9c8250 lr 0000007315f750c4 pc 0000007315f750f0
backtrace:
#00 pc 00000000000830f0 /apex/com.android.runtime/lib64/bionic/libc.so (abort 160) (BuildId: cf739dbc84bcc78f7a1500721bfb3758)
#01 pc 00000000004b99ac /apex/com.android.runtime/lib64/libart.so (art::Runtime::Abort(char const*) 2280) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#02 pc 000000000000b458 /system/lib64/libbase.so (android::base::LogMessage::~LogMessage() 580) (BuildId: 36cd125456a5320dd3dcb8cfbd889a1a)
#03 pc 0000000000377f60 /apex/com.android.runtime/lib64/libart.so (art::JavaVMExt::JniAbort(char const*, char const*) 1584) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#04 pc 0000000000378184 /apex/com.android.runtime/lib64/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list) 108) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#05 pc 000000000036a5ac /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::AbortF(char const*, ...) 136) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#06 pc 0000000000369bfc /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::CheckInstance(art::ScopedObjectAccessamp;, art::(anonymous namespace)::ScopedCheck::InstanceKind, _jobject*, bool) 420) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#07 pc 0000000000368e4c /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::CheckPossibleHeapValue(art::ScopedObjectAccessamp;, char, art::(anonymous namespace)::JniValueType) 580) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#08 pc 0000000000368468 /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::Check(art::ScopedObjectAccessamp;, bool, char const*, art::(anonymous namespace)::JniValueType*) 652) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#09 pc 0000000000371560 /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::CheckJNI::GetStringCharsInternal(char const*, _JNIEnv*, _jstring*, unsigned char*, bool, bool) 676) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#10 pc 000000000003a198 /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/lib/arm64/libcreatedata.so (Java_com_brother_ptouch_sdk_JNIWrapper_writeByteInFile 108) (BuildId: f8707a015211e716396c82b381288ee73ac39880)
#11 pc 0000000000140350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline 144) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#12 pc 00000000001375b8 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_static_stub 568) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#13 pc 000000000014600c /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) 276) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#14 pc 00000000002e3674 /apex/com.android.runtime/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*) 384) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#15 pc 00000000002de8d4 /apex/com.android.runtime/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrameamp;, art::Instruction const*, unsigned short, art::JValue*) 892) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#16 pc 00000000005a3dd4 /apex/com.android.runtime/lib64/libart.so (MterpInvokeStatic 372) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#17 pc 0000000000131994 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_static 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#18 pc 00000000001e2684 [anon:dalvik-classes2.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes2.dex] (com.brother.ptouch.sdk.JNIWrapper.byteFileWriteRGB 176)
#19 pc 00000000005a4070 /apex/com.android.runtime/lib64/libart.so (MterpInvokeStatic 1040) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#20 pc 0000000000131994 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_static 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#21 pc 00000000001e2914 [anon:dalvik-classes2.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes2.dex] (com.brother.ptouch.sdk.JNIWrapper.print 4)
#22 pc 00000000005a4070 /apex/com.android.runtime/lib64/libart.so (MterpInvokeStatic 1040) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#23 pc 0000000000131994 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_static 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#24 pc 00000000001ea6fc [anon:dalvik-classes2.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes2.dex] (com.brother.ptouch.sdk.Printer.printImage 196)
#25 pc 00000000005a15c0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual 1352) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#26 pc 0000000000131814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#27 pc 00000000001dd7e8 [anon:dalvik-classes2.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes2.dex] (com.abi_selvaraj.fhs_date_labels.MainActivity.lambda$configureFlutterEngine$0$MainActivity 360)
#28 pc 00000000005a15c0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual 1352) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#29 pc 0000000000131814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#30 pc 00000000001dd55c [anon:dalvik-classes2.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes2.dex] (com.abi_selvaraj.fhs_date_labels.-$Lambda$MainActivity$cnaSj6gUAqIaWfP_TCdFhmQeBEk.onMethodCall 4)
#31 pc 00000000005a2de0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeInterface 1788) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#32 pc 0000000000131a14 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_interface 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#33 pc 0000000000156d0e [anon:dalvik-classes3.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes3.dex] (io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage 34)
#34 pc 00000000005a2de0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeInterface 1788) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#35 pc 0000000000131a14 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_interface 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#36 pc 000000000014cce2 [anon:dalvik-classes3.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes3.dex] (io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart 98)
#37 pc 00000000005a2de0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeInterface 1788) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#38 pc 0000000000131a14 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_interface 20) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#39 pc 000000000014b908 [anon:dalvik-classes3.dex extracted in memory from /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/base.apk!classes3.dex] (io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage 8)
#40 pc 00000000002b4988 /apex/com.android.runtime/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEbb.llvm.13098898000035350125 240) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#41 pc 0000000000592868 /apex/com.android.runtime/lib64/libart.so (artQuickToInterpreterBridge 1032) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#42 pc 0000000000140468 /apex/com.android.runtime/lib64/libart.so (art_quick_to_interpreter_bridge 88) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#43 pc 0000000000137334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub 548) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#44 pc 0000000000145fec /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) 244) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#45 pc 00000000004b126c /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable constamp;, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*) 104) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#46 pc 00000000004b26b8 /apex/com.android.runtime/lib64/libart.so (art::InvokeVirtualOrInterfaceWithVarArgs(art::ScopedObjectAccessAlreadyRunnable constamp;, _jobject*, _jmethodID*, std::__va_list) 424) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#47 pc 0000000000397f88 /apex/com.android.runtime/lib64/libart.so (art::JNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list) 628) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#48 pc 000000000036ca20 /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallMethodV(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, std::__va_list, art::Primitive::Type, art::InvokeType) 2368) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#49 pc 000000000035ad00 /apex/com.android.runtime/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list) 72) (BuildId: 9e1ab66d67be247f1f43b362accdaf63)
#50 pc 00000000014628c8 /data/app/com.abi_selvaraj.fhs_date_labels-9UrlxSd-fzffTZQSnIcl_Q==/lib/arm64/libflutter.so (BuildId: fb1d4058f3179a6ac8718723ecfdf17c672f1abe)
#51 pc 0000000040000000 <unknown>
Я попробовал решения, которые я нашел в Интернете относительно обнаруженной ошибки JNI, которые все указывают на один и тот же ответ: Включая разрешение на внешнее хранилище в AndroidManifest.xml недостаточно, для Android 6.0 и выше должны быть включены разрешения во время выполнения. У меня также есть разрешения на включение во время выполнения для моего устройства. Но ошибка, похоже, остается.
Пожалуйста, помогите мне понять, где я могу ошибаться и что мне нужно проверить, чтобы устранить эту проблему. Дайте мне знать, стоит ли мне еще делиться кодом со своей стороны, и я это сделаю. Поскольку это последнее, что мне нужно исправить, прежде чем распространять свое приложение для моего клиента.
Редактировать
Ошибка была связана с рабочим путем пакета SDK принтера Brother. Я изменил его на следующее, что, казалось, решило проблему:
От:
settings.workPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/BrotherPrinter";
Для:
settings.workPath = getFilesDir() "/";
Комментарии:
1. Мне удалось решить эту проблему. Пожалуйста, проверьте мою правку.