NDK 异常检测与抛出

1.定位so库中的异常

http://www.csdn.net/article/2014-12-30/2823366-Locate-Android-NDKAndroid


2.在代码中捕获异常

NDK 是native 编程的开发环境,使用的是C或C++语言,在这个过程中,更多的是使用c与c++的混编,因为在计算机底层,c提供了丰富的函数库,所以即使使用C++,也需要不可避免的进行c libs的封装!

对于c和c++而言,一般来说潜在的异常原因很难被发现,因此我们需要进一步的抛出异常来得到错误的原因!!

在NDK交互的过程中,JNIEnv 提供了异常抛出和捕获的方法,当然C++本身也带有异常抛出的方法,但实际开发中国,C++的异常捕获处理微不足道!


先来看看异常的抛出

static void ThrowException(JNIEnv * env,const char * className,const char * message)
{
	jclass objClass = env->FindClass(className);
	if(objClass!=NULL)
	{
	 //注意,这种方式抛出的异常一般不会导致程序崩溃,因为该异常和jvm无关联,但是如果调用的java方法抛出的异常,有可能导致程序崩溃
	    env->ThrowNew(objClass,message);
	    if(0!=env->ExceptionOccurred())//检测是否有异常发生
	    {
		env->ExceptionClear();//清除异常堆栈
	    }
		env->DeleteLocalRef(objClass);
	}
}

用法:(注意)

ThrowErrorException(env,"java/io/IOException","程序读取失败");

抛出带错误的异常:

static void ThrowErrorException(JNIEnv * env,const char * className,int errNum)
{
	char buffer[MAX_LOG_MESSAGE_LENGTH];

	if(-1==strerror_r(errNum,buffer,MAX_LOG_MESSAGE_LENGTH))
	{
		strerror_r(errno,buffer,MAX_LOG_MESSAGE_LENGTH);
	}

	char logTag[MAX_LOG_MESSAGE_LENGTH];
	sprintf(logTag,"%s[%d].%s",__FILE__,__LINE__,__FUNCTION__);
	Log::I(logTag,"ThrowErrorException");

	ThrowException(env,className,buffer);
}

用法

ThrowErrorException(env,"java/io/IOException",errno);


转载于:https://my.oschina.net/ososchina/blog/369605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值