文档章节

NDK 异常检测与抛出

IamOkay
 IamOkay
发布于 2015/01/20 10:53
字数 404
阅读 883
收藏 0
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);


© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 195
博文 471
码字总数 386184
作品 0
海淀
程序员
私信 提问
NDK开发---C++学习(七):异常

前言 C++的异常处理机制能够将异常检测与异常处理分离开来,当异常发生时,它能自动调用异常处理程序进行错误处理。把错误处理代码独立出来的异常处理机制增加了程序的清晰性和可维护性,使程...

浮生若梦zp
2017/12/01
0
0
Android NDK来发之旅24--C++--异常处理

C++ 异常处理 异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try...

香沙小熊
2017/11/27
0
0
NDK开发——JNI必须掌握的常用例子

前言 要学习NDK之前,我们得先在AndroidStudio中学习JNI,还有C和C++基础,这些都是接触NDK的前提,那么废话不多说,开始吧 对于NDK在AndroidStudio的配置,可以关注我的博客找到相关文章,本...

qq_30379689
2017/09/01
0
0
Java异常

最近的写代码的过程中,遇到很多异常的处理,以前上大学的时候写代码,遇到异常直接给个try catch了事,只是停留在看懂异常能够找出异常抛出点的水平。真正写代码的时候,不了解java的异常机...

德彪
2017/11/25
0
0
如何通过Tesseract开源OCR引擎创建Android OCR应用

Tesseract是遵守 Apache License 2.0协议的开源OCR引擎。这里介绍下如何在Android平台编译Tesseract,以及如何快速创建一个简单的OCR应用。 参考原文:Making an Android OCR Application w...

yushulx
2014/12/23
0
3

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
11
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部