小编Hug*_*ugo的帖子

你如何解决Android系统库崩溃问题(libwebcore.so)

我的Android webview崩溃,adb logcat的错误转储告诉我libwebcore.so是导致分段错误的库.你怎么解决这个问题?

我最初的研究把我带到了这样的线程:如何在Android中使用addr2line,实质上是说获取库的非剥离版本并使用addr2line实用程序来查明导致分段错误的确切行

上面的帖子说"在obj/local/armeabi下使用.so文件,因为这是非剥离版本"......但我在/ usr/local/android-ndk-r6下找不到libwebcore.so 或者我的Mac上的/ usr/local/android-sdk-mac_86,我只在Android设备上的/ system/lib下找到了一个剥离版本的libwebcore.so .

有没有办法让我可以得到一个非剥离版本的libwebcore.so?或者我不是以正确的方式解决这个问题?


作为参考,这里是adb logcat吐出的错误转储:

I/DEBUG   (   65): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   65): Build fingerprint: 'google/passion/passion:2.3.4/GRJ22/121341:user/release-keys'
I/DEBUG   (   65): pid: 611, tid: 618  >>> com.swishly.gap <<<
I/DEBUG   (   65): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   65):  r0 00000002  r1 002f9564  r2 00000003  r3 …
Run Code Online (Sandbox Code Playgroud)

android crash-dumps android-ndk

8
推荐指数
1
解决办法
4019
查看次数

WKWebView:尝试从主线程同步查询javascript

有没有办法从主线程同步查询javascript?

使用具有回调参数的异步函数从本机代码查询Javascript以处理响应:

func evaluateJavaScript(_ javaScriptString: String, completionHandler completionHandler: ((AnyObject!, NSError!) -> Void)?)
Run Code Online (Sandbox Code Playgroud)

通过暂停线程并使用信号量控制执行,通常可以将异步行为转为同步:

// Executing in the main thread
let sema = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// Background thread
  self.evaluateJavaScript("navigator.userAgent", completionHandler: { (value:AnyObject!, error: NSError!) -> Void in
    if let ua = value as? String {
      userAgent = ua
    } else {
      ERROR("ERROR There was an error retrieving the default user agent, using hardcoded value \(error)")
    }
    dispatch_semaphore_signal(sema)
  })
}
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
Run Code Online (Sandbox Code Playgroud)

然而......在这种情况下,因为completionHandler一直被称为主线程,代码死锁,因为completionHandler块永远不会执行(主线程暂停由dispatch_semaphore_wait …

semaphore grand-central-dispatch ios ios8 wkwebview

8
推荐指数
1
解决办法
3342
查看次数

Android:在父进程退出后,停止运行Bonjour服务

我的应用程序本质上是一个后台服务,需要偶尔注册一个NSD服务(Bonjour服务),以便能够发现由主后台服务运行的套接字服务器(也就是由app运行).

如果我正确阅读Android Bonjour服务文档,这就是您启动Bonjour服务的方式(缩写为简洁):

mNsdManager = Context.getSystemService(Context.NSD_SERVICE);
mDiscoveryListener = new NsdManager.DiscoveryListener()
mNsdManager.discoverServices(
        SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
Run Code Online (Sandbox Code Playgroud)

......这就是你如何阻止它:

mNsdManager.unregisterService(mRegistrationListener);
Run Code Online (Sandbox Code Playgroud)

在这里,我无法解决这个问题:如果主服务突然Bonjour崩溃,那么在崩溃时注册的任何服务都会继续运行,即使它不再具有目的(它帮助发现的套接字服务器不是更长的).

Bonjour当主服务重新启动时,我无法事件清理僵尸服务,因为mRegistrationListener最初注册的服务也不再存在.

我怀疑我采取了错误的方法:Bonjour在主服务崩溃后,我如何确保不会留下一堆乱七八糟的僵尸服务?

android android-service android-networking android-nsd

6
推荐指数
1
解决办法
866
查看次数