我的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) 有没有办法从主线程同步查询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 …
我的应用程序本质上是一个后台服务,需要偶尔注册一个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 ×2
android-ndk ×1
android-nsd ×1
crash-dumps ×1
ios ×1
ios8 ×1
semaphore ×1
wkwebview ×1