Android和Unity交互崩溃

崩溃日志信息:

     E  FATAL EXCEPTION: UnityMain
     Process: cn.packageName, PID: 20736
     java.lang.Error: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
     Version '2020.3.47f1 (5ef4f5b5e2d4)', Build type 'Release', Scripting Backend 'il2cpp', CPU 'arm64-v8a'
     Build fingerprint: 'HUAWEI/NOH-AN00/HWNOH:12/HUAWEINOH-AN00/103.0.0.206C00:user/release-keys'
     Revision: '0'
     ABI: 'arm64'
     Timestamp: 2023-07-26 17:13:49+0800
     pid: 20736, tid: 20736, name: cn.packageName  >>> cn.packageName <<<
     uid: 10477
     signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4000200000000b
         x0  0000007fdf585ed8  x1  0000007fdf585ef8  x2  0000000000000002  x3  b400007a7aa620c0
         x4  b400007a7aa620b8  x5  0000000000000000  x6  0000000000000001  x7  0000000000000000
         x8  0040002000000000  x9  0000007cbe723358  x10 0040002000000000  x11 0000000000000000
         x12 00000000000000f7  x13 0040002000000000  x14 0000000000000001  x15 0000000000000011
         x16 0000007de15ad0b0  x17 0000007de159c66c  x18 0000000000000050  x19 b400007b711d7200
         x20 0000007fdf586088  x21 0000007fdf586660  x22 b400007a203cdf00  x23 b400007a203d7788
         x24 b400007a7aa620b8  x25 0000000000000000  x26 0000000000000000  x27 00000000003fffe1
         x28 0040002000000000  x29 0000007fdf585eb0
         sp  0000007fdf585eb0  lr  0000007b73141f70  pc  0000007b72e23bac

     backtrace:
           #00 pc 000000000039bbac  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::String::GetFlatContent(v8::internal::PerThreadAssertScopeDebugOnly<(v8::internal::PerThreadAssertType)0, false> const&)+16) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #01 pc 00000000006b9f6c  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)+40) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #02 pc 00000000003b536c  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::Parser::ParseFunction(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>)+840) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #03 pc 00000000003d858c  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::parsing::ParseFunction(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportErrorsAndStatisticsMode)+408) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #04 pc 00000000001c81b4  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::(anonymous namespace)::RenderCallSite(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::MessageLocation*, v8::internal::CallPrinter::ErrorHint*)+144) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #05 pc 00000000001c8b2c  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::ErrorUtils::NewCalledNonCallableError(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>)+56) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #06 pc 0000000000785e08  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*)+68) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
           #07 pc 00000000005f2d28  /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit+104) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
2023-07-26 17:13:50.388 20736-20893 AndroidRuntime          cn.packageName                       E  	at libpuerts.v8::internal::String::GetFlatContent(v8::internal::PerThreadAssertScopeDebugOnly<(v8::internal::PerThreadAssertType)0, false> const&)(GetFlatContent:16)
     	at libpuerts.v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)(GetString:40)
     	at libpuerts.v8::internal::Parser::ParseFunction(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>)(ParseFunction:840)
     	at libpuerts.v8::internal::parsing::ParseFunction(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportErrorsAndStatisticsMode)(ParseFunction:408)
     	at libpuerts.v8::internal::(anonymous namespace)::RenderCallSite(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::MessageLocation*, v8::internal::CallPrinter::ErrorHint*)(:144)
     	at libpuerts.v8::internal::ErrorUtils::NewCalledNonCallableError(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>)(NewCalledNonCallableError:56)
     	at libpuerts.v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*)(Runtime_ThrowCalledNonCallable:68)
     	at libpuerts.Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit(Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit:104)
E  FATAL EXCEPTION: UnityMain
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault
at libpuerts.v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)(GetString:40)

根据报错信息,可以看出是回调函数出现找不到数据的情况了。

交互的代码也比较简单,就是一个传值的回调。

    NativeProxyAdvertisement.listener = object : NativeProxyAdvertisementListener {
        override fun onShow(
            placementId: String,
            callback: NativeProxyAdvertisementCallbackListener?
        ) {
            log{"ttttttt:enter:${Thread.currentThread().name}:"+callback.hashCode()}
            disposable?.dispose()
            disposable = showAds(activity, placementId).subscribe({
                log{"ttttttt:handler:${Thread.currentThread().name}:"+callback.hashCode()}
                callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
                log{"ttttttt:已经完成回调"}
            }, {
                log{"ttttttt:handler:${Thread.currentThread().name}:"+callback.hashCode()}
                callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
                log{"ttttttt:已经完成回调"}
            })
        }
    }

在多次与unity交互的时候,会出现偶现崩溃的问题。

 D  message: ttttttt:enter:UnityMain:79875456,
 D  message: ttttttt:handler:main:79875456, 
 D  message: ttttttt:已经完成回调,

经过排查发现Unity的调起方法,是处于UnityMain线程中。而我们通过RXJava或者协程请求的网络数据,返回的时候,都是返回到了main主线程中。

而这里就存在线程间通信的问题。所以我们这里需要将其统一到一个线程中。避免出现跨线程通信的问题。

代码样例如下:

NativeProxyAdvertisement.listener = object : NativeProxyAdvertisementListener {
            override fun onShow(
                placementId: String,
                callback: NativeProxyAdvertisementCallbackListener?
            ) {
                log { "ttttttt:enter:${Thread.currentThread().name}:" + callback.hashCode() }
                disposable?.dispose()
                val handler = android.os.Handler()
                disposable = showAds(activity, placementId).subscribe({
                    handler.post(Runnable {
                        log { "ttttttt:handler:${Thread.currentThread().name}:" + callback.hashCode() }
                        callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
                        log { "ttttttt:已经完成回调" }
                    })
                }, {
                    handler.post(Runnable {
                        log { "ttttttt:handler:${Thread.currentThread().name}:" + callback.hashCode() }
                        callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
                        log { "ttttttt:已经完成回调" }
                    })
                })
            }
        }

运行结果如下:

 D  message: ttttttt:enter:UnityMain:191152737, 
 D  message: ttttttt:handler:UnityMain:191152737, 
 D  message: ttttttt:已经完成回调, 

可以看出这样修改之后,调用和回调,均处在UnityMain线程中,崩溃问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值