Ошибка JNIWrapper NULL jstring с принтером Brother и флаттером

#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. Мне удалось решить эту проблему. Пожалуйста, проверьте мою правку.