2016-04-05 25 views
0

Android için Delphi 10 Seattle'da bir uygulama geliştiriyorum, bu da TCameraComponent öğesinden görüntü alıp TIdUDPServer kullanarak başka bir cihaz göndermeye başladım. TIdUDPServer'ı işlemek ve görüntüleri ve diğer metin komutlarını göndermek için bir iş parçacığı oluşturdum. Bu şekilde çalışır: Ana iş parçacığı, bitmap yazısını iş parçacığının içine alır ve sonra iş parçacığı gönderir.Delphi - JNI Hatası

Sorun, her 5 veya 4 dakikada bir Uygulama'nın kilitlenme Hatası 6 hatası ile bir kez olduğunu, aynı nesneye erişen konularla ilgili olduğunu düşünüyorum, nesneyi korumak için TCriticalSection kullanmayı denedim, ancak yine de hatayı alıyorum. İşte

Ben Moto E Android 6.0, kullanıyorum imajını

type 
    TComThread = class(TThread) 
    private 
    { Some code } 
    CriticalX: TCriticalSection; 
    public 
    Constructor Create(UserType: Integer); 
    { Some code } 
    function SetGetImage(ImageBitmap: TBitmap; SetOrGet: Boolean): TBitmap; 
    protected 
    procedure Execute; override; 
    end; 

implementation 

constructor TComThread.Create(UserType: Integer); 
begin 
    inherited Create (True); 
    FreeOnTerminate := True; 
    { Some code } 
    CriticalX:= TCriticalSection.Create; 
    FImage:= TBitmap.Create; 
end; 

procedure TComThread.Execute; 
var 
    BitmSurface: TBitmapSurface; 
    ToJPEG: TBitmapCodecManager; 
    quality: TBitmapCodecSaveParams; 
    CameraImg: TMemoryStream; 
begin 
    while SendBabyVideo do 
    begin 
    try 
     if Assigned(FImage) then 
     begin 
     try 
      CameraImg:= TMemoryStream.Create(); 
      BitmSurface:= TBitmapSurface.Create; 
      ToJPEG:= TBitmapCodecManager.Create; 
      quality.Quality:= 50; 
      //BitmSurface.Assign(FImage); 
      BitmSurface.Assign(SetGetImage(nil, False)); 
      Log.d('DBBaby', nil, 'SurfWidth ' + IntToStr(BitmSurface.Width)); 
      if (BitmSurface.Width > 0) AND (BitmSurface.Height > 0) then 
      begin 
      // Image stream ready 
      ToJPEG.SaveToStream(CameraImg, BitmSurface, '.jpg', @quality); 
      CamSize:= CameraImg.Size; 
      SetLength(bffrImg, CamSize+8); 
      bffrImg[0]:= $FF; 
      bffrImg[1]:= $FF; 
      bffrImg[2]:= $16; 
      bffrImg[3]:= $09; 
      bffrImg[4]:= byte(CamSize); 
      bffrImg[5]:= byte(CamSize shr 8); 
      bffrImg[6]:= byte(CamSize shr 16); 
      bffrImg[7]:= byte(CamSize shr 24); 

      CameraImg.Position:= 0; 
      CameraImg.Read(bffrImg[8], CamSize); 

      Log.d('DBBaby', nil, 'Imagem total: '+IntToStr(Length(bffrImg))); 
      end; 
     finally 
      BitmSurface.Free; 
      BitmSurface:= nil; 
      ToJPEG.Free; 
      ToJPEG:= nil; 
      CameraImg.Free; 
      CameraImg:= nil; 
     end; 
     end; 
    except 
     on E: Exception do 
     begin 
     Log.d('DBBaby', nil, '------------------------ GET STREAM'); 
     Log.d('DBBaby', nil, E.message); 
     end; 
    end; 

    try 
     if (PeerIP <> '') AND (PeerIP <> '255.255.255.255') then 
     begin 
     if (bffr <> nil) AND (bffrImg <> nil) then 
     begin 
      FUDPBABY.SendBuffer(PeerIP, PeerPort, TIdIPVersion.Id_IPv4, bffr); 
      FUDPBABY.SendBuffer(PeerIP, PeerPort, TIdIPVersion.Id_IPv4, bffrImg); 
     end; 
    except 
     on E: Exception do 
     begin 
     Log.d('DBBaby', nil, '------------------------ SEND STREAM'); 
     Log.d('DBBaby', nil, E.message); 
     end; 
    end; 
    end; 
end; 

function TComThread.SetGetImage(ImageBitmap: TBitmap; SetOrGet: Boolean): TBitmap; 
begin 
    CriticalX.Enter; 
    try 
    if SetOrGet then 
    begin 
     Self.FImage.Assign(ImageBitmap); 
     Result:= nil; 
    end 
    else 
    begin 
     Result:= Self.FImage; 
    end; 
    finally 
    CriticalX.Leave; 
    end; 
end; 

göndermek için iplik parçası kod burada

procedure TFormMain.CameraComponent1SampleBufferReady(Sender: TObject; 
    const ATime: TMediaTime); 
var 
    Bitm: TBitmap; 
begin 
    try 
    Bitm:= TBitmap.Create; 
    CameraComponent1.SampleBufferToBitmap(Bitm, True); 
    BabyImag.Bitmap.Assign(Bitm); 
    Log.d('DBBaby', nil, 'Image on Screen'); 
    if SendVideo then 
     FCommThread.SetGetImage(Bitm, True); 
    finally 
    Bitm.Free; 
    Bitm:= nil; 
    end; 
end; 

Ve ana iş parçacığı kod olmasıdır NDK, r11b'dir. SDK Yöneticisi'nde tüm konfigürasyonları API 23'e ayarlıyorum.

İşte Log.

04-05 17:00:28.743 27591-27591/com.Test2.Project2 D/skia: onFlyCompress 
04-05 17:00:28.780 27591-27611/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-05 17:00:28.807 27591-27591/com.Test2.Project2 D/skia: onFlyCompress 
04-05 17:00:28.818 27591-28475/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): SurfWidth 144 
04-05 17:00:28.822 27591-28475/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Imagem total: 1946 
04-05 17:00:28.846 27591-27611/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-05 17:00:28.876 27591-27591/com.Test2.Project2 D/skia: onFlyCompress 
04-05 17:00:28.912 27591-27611/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-05 17:00:28.942 27591-27591/com.Test2.Project2 D/skia: onFlyCompress 
04-05 17:00:28.978 27591-27611/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-05 17:00:29.008 27591-28475/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): SurfWidth 144 
04-05 17:00:29.012 27591-27591/com.Test2.Project2 D/skia: onFlyCompress 
04-05 17:00:29.015 27591-28475/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Imagem total: 1943 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0xb9f7a0b0 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410]  from java.lang.Object com.embarcadero.rtl.ProxyInterface.dispatchToNative(java.lang.String, java.lang.Object[], long) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | group="main" sCount=0 dsCount=0 obj=0x73f5af98 self=0xb70f0c60 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | sysTid=27591 nice=0 cgrp=default sched=0/0 handle=0xb6f94b34 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | state=R schedstat=(46379176934 4119603860 17774) utm=4206 stm=431 core=0 HZ=100 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | stack=0xbe418000-0xbe41a000 stackSize=8MB 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | held mutexes= "mutator lock"(shared held) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #00 pc 0035c6d5 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+116) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #01 pc 0033d7cf /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+138) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #02 pc 0024f6a1 /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+760) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #03 pc 0024fda9 /system/lib/libart.so (art::JavaVMExt::JniAbortF(char const*, char const*, ...)+68) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #04 pc 0033e32b /system/lib/libart.so (art::Thread::DecodeJObject(_jobject*) const+174) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #05 pc 000fff55 /system/lib/libart.so (art::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::JniValueType*) (.constprop.95)+900) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #06 pc 0010e193 /system/lib/libart.so (art::CheckJNI::CallMethodA(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, jvalue*, art::Primitive::Type, art::InvokeType)+498) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #07 pc 0010ed57 /system/lib/libart.so (art::CheckJNI::CallIntMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue*)+30) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #08 pc 006913e5 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (ExecJNI+884) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #09 pc 01135073 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #10 pc 01141607 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #11 pc 010b047f /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #12 pc 010ab189 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #13 pc 01135021 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #14 pc 005d9d5f /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #15 pc 005cde87 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #16 pc 005cf035 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #17 pc 005ac013 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #18 pc 006a10bf /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #19 pc 000aca1b /data/app/com.Test2.Project2-2/oat/arm/base.odex (java.lang.Object com.embarcadero.rtl.ProxyInterface.dispatchToNative(java.lang.String, java.lang.Object[], long)+134) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #20 pc 000acadb /data/app/com.Test2.Project2-2/oat/arm/base.odex (java.lang.Object com.embarcadero.rtl.ProxyInterface.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])+118) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #21 pc 0029879d /system/framework/arm/boot.oat (???) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.embarcadero.rtl.ProxyInterface.dispatchToNative(Native method) 
04-05 17:00:29.163 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.embarcadero.rtl.ProxyInterface.invoke(ProxyInterface.java:21) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.hardware.Camera$PreviewCallback.onPreviewFrame(Camera.java:-2) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1129) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.os.Handler.dispatchMessage(Handler.java:102) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.os.Looper.loop(Looper.java:148) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.app.ActivityThread.main(ActivityThread.java:5443) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at java.lang.reflect.Method.invoke!(Native method) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-05 17:00:29.165 27591-27591/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] 

04-05 17:00:29.501 27591-27591/com.Test2.Project2 A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 27591 

Herhangi bir yardım için teşekkür ederiz.

Ben kodu denedim, ama hala Ölümcül Sinyal 6 günlüğüne bakın olsun:

04-06 08:24:12.660 18999-19023/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-06 08:24:12.712 18999-18999/com.Test2.Project2 D/skia: onFlyCompress 
04-06 08:24:12.726 18999-19023/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Image on Screen 
04-06 08:24:12.778 18999-18999/com.Test2.Project2 D/skia: onFlyCompress 
04-06 08:24:12.779 18999-20099/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): SurfWidth 144 
04-06 08:24:12.784 18999-20099/com.Test2.Project2 I/info: FMX: Project2: DBBaby (Nil): Imagem total: 2984 
04-06 08:24:12.785 18999-18999/com.Test2.Project2 E/art: JNI ERROR (app bug): accessed stale global reference 0x203776 (index 3549 in a table of size 3546) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: use of deleted global reference 0x203776 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410]  from java.lang.Object com.embarcadero.rtl.ProxyInterface.dispatchToNative(java.lang.String, java.lang.Object[], long) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | group="main" sCount=0 dsCount=0 obj=0x73f5af98 self=0xb70f0c60 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | sysTid=18999 nice=0 cgrp=default sched=0/0 handle=0xb6f94b34 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | state=R schedstat=(5347038051 485186867 2088) utm=480 stm=54 core=3 HZ=100 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | stack=0xbe418000-0xbe41a000 stackSize=8MB 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] | held mutexes= "mutator lock"(shared held) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #00 pc 0035c6d5 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+116) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #01 pc 0033d7cf /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+138) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #02 pc 0024f6a1 /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+760) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #03 pc 0024fda9 /system/lib/libart.so (art::JavaVMExt::JniAbortF(char const*, char const*, ...)+68) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #04 pc 0033e52b /system/lib/libart.so (art::Thread::DecodeJObject(_jobject*) const+686) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #05 pc 000fff55 /system/lib/libart.so (art::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::JniValueType*) (.constprop.95)+900) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #06 pc 0010e193 /system/lib/libart.so (art::CheckJNI::CallMethodA(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, jvalue*, art::Primitive::Type, art::InvokeType)+498) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #07 pc 0010ee41 /system/lib/libart.so (art::CheckJNI::CallObjectMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue*)+28) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #08 pc 00691773 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (ExecJNI+1826) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #09 pc 0113503b /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #10 pc 011415d7 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #11 pc 010b0451 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #12 pc 010ab169 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #13 pc 01134fe9 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #14 pc 005d9d3f /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #15 pc 005cde67 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #16 pc 005cf015 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #17 pc 005abff3 /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #18 pc 006a109f /data/app/com.Test2.Project2-2/lib/arm/libProject2.so (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #19 pc 000aca1b /data/app/com.Test2.Project2-2/oat/arm/base.odex (java.lang.Object com.embarcadero.rtl.ProxyInterface.dispatchToNative(java.lang.String, java.lang.Object[], long)+134) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #20 pc 000acadb /data/app/com.Test2.Project2-2/oat/arm/base.odex (java.lang.Object com.embarcadero.rtl.ProxyInterface.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])+118) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] native: #21 pc 0029879d /system/framework/arm/boot.oat (???) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.embarcadero.rtl.ProxyInterface.dispatchToNative(Native method) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.embarcadero.rtl.ProxyInterface.invoke(ProxyInterface.java:21) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.hardware.Camera$PreviewCallback.onPreviewFrame(Camera.java:-2) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1129) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.os.Handler.dispatchMessage(Handler.java:102) 
04-06 08:24:12.839 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.os.Looper.loop(Looper.java:148) 
04-06 08:24:12.840 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at android.app.ActivityThread.main(ActivityThread.java:5443) 
04-06 08:24:12.840 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at java.lang.reflect.Method.invoke!(Native method) 
04-06 08:24:12.840 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
04-06 08:24:12.840 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-06 08:24:12.840 18999-18999/com.Test2.Project2 A/art: art/runtime/java_vm_ext.cc:410] 
04-06 08:24:12.840 18999-19006/com.Test2.Project2 W/art: Suspending all threads took: 38.697ms 
04-06 08:24:13.103 18999-18999/com.Test2.Project2 A/art: art/runtime/runtime.cc:399] Runtime aborting... 
04-06 08:24:13.103 18999-18999/com.Test2.Project2 A/art: art/runtime/runtime.cc:399] Aborting thread: 

04-06 08:24:13.107 18999-18999/com.Test2.Project2 A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 18999 

cevap

2

Sen yeterince yeterince parçacığının FBitmap nesneyi korumak değildir.

iplik SetGetImage(nil, False) aramaları

, TCriticalSection kilitli ve daha sonra BitmSurface için Assign() 'lı olduğunda bu şekilde FBitmap erişim kilitlenmez, SetGetImage() çıkmadan önce açılır. Bu, ana iş parçacığının FBitmap'u değiştirebileceği anlamına gelirken, BitmSurface hala kopyalamakla meşgul.

yerine bunun gibi daha fazla bir şey deneyin:

procedure TFormMain.CameraComponent1SampleBufferReady(Sender: TObject; 
    const ATime: TMediaTime); 
begin 
    CameraComponent1.SampleBufferToBitmap(BabyImag.Bitmap, True); 
    Log.d('DBBaby', nil, 'Image on Screen'); 
    if SendVideo then 
    FCommThread.SetImage(BabyImag.Bitmap); 
end; 

type 
    TComThread = class(TThread) 
    private 
    { Some code } 
    procedure GetImage(ASurface: TBitmapSurface); 
    protected 
    procedure Execute; override; 
    public 
    Constructor Create(UserType: Integer); 
    { Some code } 
    function SetImage(AImage: TBitmap); 
    end; 

implementation 

constructor TComThread.Create(UserType: Integer); 
begin 
    inherited Create(True); 
    { Some code } 
    FImage := TBitmap.Create; 
end; 

procedure TComThread.Execute; 
var 
    BitmSurface: TBitmapSurface; 
    ToJPEG: TBitmapCodecManager; 
    quality: TBitmapCodecSaveParams; 
    CameraImg: TMemoryStream; 
begin 
    BitmSurface := TBitmapSurface.Create; 
    ToJPEG := TBitmapCodecManager.Create; 
    quality.Quality := 50; 
    try 
    while SendBabyVideo do 
    begin 
     try 
     GetImage(BitmSurface); 
     Log.d('DBBaby', nil, 'SurfWidth ' + IntToStr(BitmSurface.Width)); 
     if (BitmSurface.Width > 0) and (BitmSurface.Height > 0) then 
     begin 
      // Image stream ready 
      CameraImg.Clear; 
      try 
      ToJPEG.SaveToStream(CameraImg, BitmSurface, '.jpg', @quality); 
      CamSize := CameraImg.Size; 
      SetLength(bffrImg, CamSize+8); 
      bffrImg[0] := $FF; 
      bffrImg[1] := $FF; 
      bffrImg[2] := $16; 
      bffrImg[3] := $09; 
      bffrImg[4] := byte(CamSize); 
      bffrImg[5] := byte(CamSize shr 8); 
      bffrImg[6]:= byte(CamSize shr 16); 
      bffrImg[7]:= byte(CamSize shr 24); 

      CameraImg.Position := 0; 
      CameraImg.ReadBuffer(bffrImg[8], CamSize); 
      finally 
      CameraImg.Clear; 
      end; 

      Log.d('DBBaby', nil, 'Imagem total: '+IntToStr(Length(bffrImg))); 
     end; 
     except 
     on E: Exception do 
     begin 
      Log.d('DBBaby', nil, '------------------------ GET STREAM'); 
      Log.d('DBBaby', nil, E.Message); 
     end; 
     end; 

     try 
     if (PeerIP <> '') and (PeerIP <> '255.255.255.255') and 
      (bffr <> nil) and (bffrImg <> nil) then 
     begin 
      FUDPBABY.SendBuffer(PeerIP, PeerPort, TIdIPVersion.Id_IPv4, bffr); 
      FUDPBABY.SendBuffer(PeerIP, PeerPort, TIdIPVersion.Id_IPv4, bffrImg); 
     end; 
     except 
     on E: Exception do 
     begin 
      Log.d('DBBaby', nil, '------------------------ SEND STREAM'); 
      Log.d('DBBaby', nil, E.Message); 
     end; 
     end; 
    end; 
    finally 
    CameraImg.Free; 
    ToJPEG.Free; 
    BitmSurface.Free; 
    end; 
end; 

procedure TComThread.GetImage(ASurface: TBitmapSurface); 
begin 
    TMonitor.Enter(FImage); 
    try 
    ASurface.Assign(FImage); 
    finally 
    TMonitor.Exit(FImage); 
    end; 
end; 

procedure TComThread.SetImage(AImage: TBitmap); 
begin 
    TMonitor.Enter(FImage); 
    try 
    FImage.Assign(AImage); 
    finally 
    TMonitor.Exit(FImage); 
    end; 
end; 
+0

Merhaba Remy, ben kodunuzu denedikten sonra hâlâ günlüğüne bakın, Ölümcül Sinyal 6 olsun : –