Android 下 Poco库的异常不能被catch

POCO::NET::TCPServer框架学习以及使用 POCO::NET::TCPServer框架学习以及使用 一、预备知识: 1、POCO ​ POCO C++ Libraries是一套第三方库,去年的这个时候才进入公司实习,前辈让我接触这个库很难受官网全是英文:https://pocoproject.org/,GitHub:https://github.com/pocoproject/poco ,库方法查找:https://pocoprojec... 阅读详情

记一次Android项目中SDK里Poco库异常无法捕获的问题,编译Poco库,打开了异常的选项:android.mk

LOCAL_CPPFLAGS   := -frtti -fexceptions

在JNI的动态库中有异常抛出时无法正常捕获,会让程序崩溃。

  • 解决方法:在使用Poco库的异常时,需要在之前正常catch过一次才能让Poco库的异常被catch。

项目的这个问题是解决了,但并没有弄明白,看了源码也没发现问题,有知道的朋友可以在下方留言探讨下。

本想着是不是android的SDK中都无法正常捕获三方库中的异常时,写了一个demo.so,

#include "Demo.h"
int  add(int a, int b)
{
	throw -1;
	return a + b;
}

在android studio 新建一个native工程, 参考上一篇文章:android studio cmake使用三方库

在native-lib.cpp捕获:

    try{
        LOGI(" try Demo.so Add Func ...");
        int a =  add(4, 6);
        LOGI(" add result:%d", a);
    }catch (...)
    {
        LOGI("catch add ....");
    }

通过日志查看,可以被正常捕获:

通过demo.so验证了SDK中三方so的异常是可以捕获的。

看到可以捕获异常了,在继续把poco库中的异常也加入看下效果:

try {
       const std::string str = "10.135.129.41:8888";
        Poco::Net::SocketAddress sa;
        Poco::Net::StreamSocket ss;
        LOGI("try Poco socket Address...");
        ss.connect(sa, Poco::Timespan(6, 0));
        LOGI(" try Poco connect ---------");
    }
    catch (Poco::Exception &e)
    {
      std::string str = e.displayText();
      LOGI("catch Poco connect Exception .....%s.", str.c_str());
    }

运行结果比较意外,竟然可以捕获到了异常:

在得到意外结果后继续验证了是不是Poco库都需要在使用前先用标准异常,但是发现直接在cpp中使用poco的Exception后,Poco库也能正常被捕获,代码标号2处。

Demo地址:

https://github.com/caifubing/AndroidStudio_Pro.git

native-lib.cpp代码: 在只用4之前,1、2、3任何一处被执行都可以正常被捕获,否则程序会崩溃。

#include <jni.h>
#include <string>

#include <exception>
#include <stdexcept>
#include <iostream>
#include <android/log.h>
#include "Demo.h"

#include "string.h"
#include "Poco/Config.h"
#include "Poco/Foundation.h"
#include "Poco/Exception.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/NetException.h"
#include "Poco/NumberFormatter.h"
#include "Poco/Timestamp.h"

using  namespace Poco;

#define TAG "jni_logger"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)

using namespace std;
extern "C" JNIEXPORT jstring JNICALL
Java_com_c_1digi_pocoexception_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
////1. c++标准库异常
//    try {
//        LOGI("throw 1");
//        throw  1;
//    }catch (...)
//    {
//        LOGI("catch ... throw 1");
//    }
/*
////2. poco 网络异常
    try {
        LOGI("try NetException ...");
        throw Net::NetException();
    }catch (Poco::Exception &e )
    {
        LOGI("cathc NetException ... %s", e.displayText().c_str());
    }
    */

////3. 三方so中抛出c++标准异常
    try{
        LOGI(" try Demo.so Add Func ...");
        int a =  add(4, 6);
        LOGI(" add result:%d", a);
    }catch (...)
    {
        LOGI("catch add ....");
    }


////4. 三方so中抛出poco 网络异常
    try {
       const std::string str = "10.135.129.41:8888";
        Poco::Net::SocketAddress sa;
        Poco::Net::StreamSocket ss;
        LOGI("try Poco socket Address...");
        ss.connect(sa, Poco::Timespan(6, 0));
        LOGI(" try Poco connect ---------");
    }
    catch (Poco::Exception &e)
    {
      std::string str = e.displayText();
      LOGI("catch Poco connect Exception .....%s.", str.c_str());
    }

    return env->NewStringUTF(hello.c_str());
}

 

 

 

C++跨平台开发实战:从原理到最佳实践 跨平台开发是现代软件开发的核心需求,它允许同一套代码在不同操作系统和硬件架构上运行。C++通过源代码级兼容实现跨平台,相比虚拟机方案具有性能无损、硬件级控制和资源高效等优势。关键技术包括条件编译、标准化API和跨平台构建工具如CMake。在游戏开发、嵌入式系统和服务器应用等场景中,C++的"一次编写,多处编译"特性显著提升开发效率。本文以日志系统为例,展示如何使用std::filesystem和std::thread实现跨平台组件,并分享Qt、Boost.Asio等热门的跨平台库选型建议。 阅读详情

相关推荐

Poco库http客户端代码

1.发起一个GET请求//使用给定的服务器ip 和端口实例化一个http客户端类,但并没建立连接. HTTPClientSession session(hostIP, Port); //建立一个请求类,但也没有真正连接,path是请求的路径,如果请求http://192.168.4.19:8000/radapi10/userauth.htm那么这时string path=/radapi10/use

u011235332的专栏 2504

POCO::Net 简单的HTTPS程序

历时两周,整整两周,才把这个HTTPS的程序弄好,不知是笨还是什么的,谢天谢地,总算能发送了。 开始时走了很多弯路,一是POCO库下载了个阉割版本的,OpenSSL也下了个阉割版本的,搞的自己 奇怪了一两天,一直在国外网上找寻有用的信息。google都搜烂了。第一周过后,虽然能使用HTTP 发送程序了,却留下了HTTPS这个难题,只能下周才能慢慢解决了。 第二周,仔细阅读POCO官方的

翠屏阿姨 1万+

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1312

Android.mk使用简介(以PREBUILT_SHARED_LIBRARY和BUILD_SHARED_LIBRARY扩展描述)

用来指定一个预先已经编译好的动态库,与BUILD_SAHRED_LIBRARY和BUILD_STATIC_LIBRARY不同,该模块对应的LOCAL_SRC_FILES不能是源文件,而只能是一个已经编译好的的动态库的路径,如foo/libfoo.so。该变量指向一个构建脚本并收集所有通过LOCAL_XXX变量指定的关于当前模块的信息,并根据你所列出的源文件构建一个动态库(.so)使用该变量前,你应该至少定义了LOCAL_MODULE和LOCAL_SRC_FILES。包含了构建该模块的源文件列表。

格物致知的专栏 [音视频编解码 网络协议 计算机视觉 计算机图形学 图像理解 语音识别 机器学习 模拟电路 传感器] 2710

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 378

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

android.mk local_cppflags,Android.mk简介(9)

简介Android.mk文件是GNU Make的一小部分,它用来对Android程序进行编译。因为所有的android.mk都在同一个GNU Make执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,应尽量少声明变量。一个Android.mk文件可以编译多个模块,模块类型如下:1. APK程序一般的Android程序,编译打包生成apk文件2. JAVA库java类库,编译打...

weixin_34392227的博客 1187

SAP后台JOB保姆级教程:从SM36创建到SM37监控,手把手教你搞定ABAP程序定时任务

本文详细解析SAP后台JOB从创建到监控的全流程,重点介绍SM36创建和SM37监控的操作步骤与最佳实践。通过真实案例演示如何配置定时任务、处理常见故障及实施企业级管理策略,帮助ABAP开发者高效管理后台程序执行。

weixin_30838873的博客 430

【C++】POCO学习总结(九):网络

Poco::Net::ServerSocket是较底层次的封装,在创建TCP服务器时,推荐使用Poco::Net::TCPServer或Reactor框架。Poco::Net::SocketAddress 是将 Poco::Net::IPAddress与端口号结合起来,从而标识IP网络连接的端点。Poco::Net::DatagramSocket的子类Poco::Net::MulticastSocket允许发送组播数据报。Poco::Net::StreamSocket用于创建到服务器的TCP连接。

郭老二 2557

MicroCap声学仿真介绍(一)

5-频率上下限选择,需要注意的是,第一个数字是上限,第二个数字是下限,如果填反了,会有报错提示;下三角可以选择“Auto”、“linear”、“log”和“list”,设置的是频率点之间的距离和频率点的数量。Component是用来选择部件的模块,如上图所示,声学仿真常用到的是“Electroacoustic Macros AC”、“Electroacoustic Macros TR”、“NXP Transducers”以及“NXP HD components”。3是声学部件,是声学仿真中常用的部件。

山无忧的博客 5093

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1253

Unity3D中SqlCipher4Unity3D插件集成与跨平台加密数据库实战指南

在移动应用和游戏开发中,数据持久化是基础且关键的技术环节。本地数据存储通常涉及结构化数据的组织与查询,SQLite因其轻量、高效和跨平台特性,成为众多开发者的首选嵌入式数据库。其核心原理是通过一个单一文件存储整个数据库,并通过SQL引擎进行数据操作。然而,当应用涉及敏感信息(如用户存档、内购凭证)时,数据安全便成为技术选型的重要考量。为此,基于SQLite的加密扩展SqlCipher应运而生,它采用AES-256算法对数据库文件进行透明加密,在提供强大安全性的同时,保持了SQLite的易用性。这一技术对于防

weixin_34049948的博客 422

使用SSC添加大量的SDO条目

使用SSC添加大量的SDO条目 SSC用表格添加SDO,PDO部分必须指定到0x1600和0x1A00分配TxPdo和RxPdo映射,在0x1C12和0x1C13分别分配到SM2和SM3。在0x6000和0x7000未指定的entry就是SDO部分。

PI_sunyang的博客 3166

Unity游戏数据存储:从可靠性、安全性到兼容性的全方位解决方案

数据持久化是游戏开发中的基础技术概念,它确保应用状态在会话间得以保留。其核心原理在于将内存中的对象通过序列化转换为可存储格式,再经加密、校验等处理后写入文件系统。这一技术的价值在于保障玩家进度安全、维护游戏经济系统公平性,并支持跨平台与长期更新。在Unity游戏开发中,数据存储面临可靠性(防丢失)、安全性(防篡改)和兼容性(跨版本/平台)三大核心挑战。针对这些挑战,成熟的解决方案通常采用分层架构,结合AES加密、HMAC校验与数据版本迁移机制,构建健壮的存档系统。本文以“Save Game Free”设计模

clijovtbq401783153的博客 442

127.手机防回滚机制(Anti-Rollback)详解|efuse熔丝原理与降级绕过方案

手机刷机与维修技术指南 本文针对电子工程师和维修人员,详细介绍了主流手机品牌(高通、联发科、苹果)的刷机原理与维修方法。内容包括三大平台的刷机协议差异、关键操作模式(Fastboot/DFU/EDL)、分区表修复等核心技术,并提供了完整的Python自动化刷机脚本。文章重点解决系统崩溃、基带丢失、分区损坏等常见故障,涵盖从环境搭建到具体操作的全流程指导,所有指令均经过实测验证。适用于专业维修场景下的跨品牌设备修复需求。

2601_95651806的博客 291

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

移动端自动化内容发布:从UI测试到开放API的技术路径与风险规避

移动端自动化测试是提升应用开发与运营效率的关键技术,其核心原理在于模拟用户操作或直接与服务器交互以实现程序化控制。在工程实践中,UI自动化框架(如Appium、Airtest)和协议逆向是常见实现方式,但两者均面临平台风控检测与高维护成本的风险。尤其在高频、刚需的跨平台内容分发场景下,自动化发布工具的技术价值凸显,它能显著提升内容运营的批量化管理与数据驱动决策效率。然而,在抖音、快手、哔哩哔哩等头部平台生态内,直接采用对抗性技术方案极易触发账号封禁。因此,回归技术本质与商业逻辑,通过官方开放平台API进行合

weixin_30765577的博客 403

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

自动化测试实战:从接口到UI的完整学习路径与工程化进阶

自动化测试是软件质量保障的核心手段,其本质并非编写脚本,而是构建稳定、可维护的测试体系。基于测试金字塔分层原理,接口自动化、UI自动化与移动端自动化分别解决不同层面的验证问题:接口层保障数据交互正确性,UI层模拟真实用户操作,移动端则覆盖App兼容性。实际项目中,Selenium与Playwright是UI自动化的主流工具,而Requests+Pytest框架则能高效实现接口自动化。面对动态弹窗、环境数据污染、偶发失败等工程挑战,需掌握显式等待、Page Object模式与数据隔离等最佳实践。本文从环境搭建

weixin_28840591的博客 290

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++ 使用Poco库进行网络编程

C++ 使用Poco库进行网络编程。

二分掌柜的 1741

Android.mk语法知识--------详细

Indroduction 本篇文档描述Andrid.mk编译文件的语法。Android.mk文件向Android NDK描述你的C和C++文件。为了更好的理解下面的内容,你需要阅读docs/OVERVIEW.html文档,里面介绍了该文件的用途和用法。 Oerview 编写Android.mk是为了向编译系统描述你的源码。具体如下: 该文件是一个很小的GNU Make文件,会被编译系...

Terry_fan 750

如何在Android.mk定义C/C++宏

如何在Android.mk定义C/C++宏

weixin_48438353的博客 1137

android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍

模块描述变量:下面的变量用于向编译系统描述你的模块。你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义。正如前面描写的那样,$(CLEAR_VARS是一个脚本,清除所有这些变量,除非在描述中显式注明。LOCAL_PATH这个变量用于给出当前文件的路径。你必须在Android.mk的开头定义,可以这样使用:LOCAL_PATH := ...

weixin_36331058的博客 1682

从Poco::Net::HTTPServerRequest 中获取Content

尤其是数据中有 ‘=’ 存在的时候,Poco::Net::HTMLForm 会直接把 ‘=’ 作为分隔符使用,'=‘左边的是 name,’='右边的是 value。当 Poco 检测到 Content-Type 是 multipart/form-data 的时候,就会执行。方法,如果不是 multipart/form-data ,那么就执行。Poco::Net::HTMLForm 对象初始化的时候,会首先读取。如果接收到的数据是 json,那么最好不要使用。中的数据,然后对数据进行解析。

weixin_41502364的博客 848

Android.mk详解:构建Android项目的编译控制文件

Android.mk语法以及使用详解

byte轻骑兵的技术小窝 2165

C++使用Poco库指定网卡去接收组播数据

以下代码封装了一个UDP接收组播数据的类,第一个构造函数Poco::Net::SocketAddress类可以实现UDP单播数据的接收、发送以及往组播发送数据,第二个构造函数使用Poco::Net::MulticastSocket类去接收组播数据,UdpUnit类中成员函数Recv仅仅实现了组播数据的接收,可以改成使用Poco::Net::SocketAddress去接收单播数据。

晓琴儿 856

POCO库中文编程参考指南(5)Poco::Net::SocketAddress

POCO库中文编程参考指南(5)Poco::Net::SocketAddress 作者:柳大·Poechant 博客:Blog.优快云.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -&gt; @) 日期:April 14th, 2012 1 枚举 最大地址长度,这个与Poco::Net::IPAddress中的定义可以类比,不过这里指的是`str...

188

POCO::Net 简单的HTTP客户端,服务器程序

今天让我们来开始一个简单的HTTP程序,分为客户端和服务器。 先来完成一个客户端程序。所要关心的类有 HTTPSClientSession //HTTP会话类 HTTPRequest //HTTP请求类 HTTPResponse //HTTP回应类首先当然是建立一个会话,在此基础上发送一个请求,最后收到一个回应。 HTTPClientSession s("127.0.0.1"

翠屏阿姨 8646
上一篇: Android Studio Cmake 引入三方库
下一篇: Android Studio Native工程报错:undefined reference to std::__ndk1::basic_string
caifubing
博客等级 码龄12年 12粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值