多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
抛出一个异常包括两个步骤: 1. 照抄异常对应的类型 2. 调用ThrowNew函数。 为了简化这个任务,我们通常会写一个工具函数用来抛出一个指定名字的异常。 ~~~ void JNU_ThrowByName(JNIEnv *env, const char* name, const char* msg){ jclass cls = (*env)->FindClass(env, name); /*if cls is NULL, an exception has already been thrown */ if(cls){ (*env)->ThrowNew(env, cls, msg); } /* free the local ref */ (*env)->DeleteLocalRef(env, cls); } ~~~ 在本书中,"JNU" 前缀表示JNI Utilities. JNU_ThrowByName 首先调用FindClass查找到异常对应的类型,如果累查找失败(return NULL), 虚拟机必须抛出一个异常(比如NoClassDefFoundError).在这个示例中,JNU_ThrowByName没有尝试抛出其他的异常。如果FindClass成功,我们会调用ThrowNew抛出指定名字的异常,当JNI_ThrowNew返回的时候,它会保证有一个异常正在抛出,尽管这个异常不必与指定的异常名称相匹配,我们需要保证删除指向在这个函数调用中创建的异常的本地引用。如果传递NULL给DeleteLocalRef,什么都不会执行,所以对于FindClass失败并返回NULL的时候调用这个函数处理返回值,也是可以的。