Jni C/C++运行时遇到异常怎么办?捕获与抛出
来源:互联网 发布:网络划分的策略 编辑:程序博客网 时间:2024/05/18 17:02
有个头疼的问题,Jni C/C++遇到问题闪退怎么办?有办法,我们可以在异常发生后通过判断清除异常解决,保持程序及时反应处理。
比如:
package crash;import java.security.NoSuchAlgorithmException;public class DogUtils { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } public static native void test(); public static void test1() throws NoSuchAlgorithmException { throw new NoSuchAlgorithmException("发生错误"); } public static native void throwException();}
在Jni中调用DogUtils类的test1方法,正常来讲程序一定闪退。但通过ExceptionClear清除异常后,程序会继续运行,是不是没想到字节码还有这样的优点。
extern "C" JNIEXPORT void JNICALLJava_crash_DogUtils_test(JNIEnv *env, jobject /* this */) { jclass jcls = (env)->FindClass("crash/DogUtils"); jmethodID testMethod1 = (env)->GetStaticMethodID(jcls, "test1", "()V"); if (env->ExceptionCheck()) { env->ExceptionClear();//清除异常 LOGD("GetStaticMethodID时发生错误"); } (env)->CallStaticVoidMethod(jcls, testMethod1); if (env->ExceptionCheck()) { env->ExceptionClear();//清除异常 LOGD("CallStaticVoidMethod时发生错误"); } //调用DogUtils类中不存在的test2方法 jmethodID testMethod2 = (env)->GetStaticMethodID(jcls, "test2", "()V"); if (env->ExceptionCheck()) { env->ExceptionClear();//清除异常 LOGD("获取test2时发生错误"); } if (testMethod2 == NULL) { LOGD("test2方法不存在"); return; } (env)->CallStaticVoidMethod(jcls, testMethod2); if (env->ExceptionCheck()) { env->ExceptionClear();//清除异常 LOGD("调用test2时发生错误"); }}
在Java层面调用DogUtils类的throwException方法,也不会影响程序运行,因为及时清除了这个异常:
extern "C" JNIEXPORT void JNICALLJava_crash_DogUtils_throwException(JNIEnv *env, jobject /* this */) { env->ThrowNew(env->FindClass("java/lang/Exception"), "这里出现了异常"); env->ExceptionClear();//清除异常}
0 0
- Jni C/C++运行时遇到异常怎么办?捕获与抛出
- jni异常,c++抛出异常,java捕获
- Delphi 异常抛出与捕获
- C++:抛出异常与类的引用
- JAVA捕获异常与抛出异常
- JavaScript 异常与捕获(抛出异常)
- Objective-C 编程语言(11)异常处理----捕获多种类型的异常、抛出异常
- java异常的捕获与抛出原则
- java异常的捕获与抛出原则
- C++异常抛出与捕获及处理
- 一个例子明白抛出与捕获异常
- Java- 异常的抛出与捕获
- C++异常抛出与捕获及处理
- java异常的捕获与抛出原则
- java异常的捕获与抛出原则
- C++的异常抛出与捕获
- c#socket和多线程结合使用时使用try-catch语句无法捕获住抛出的异常的问题
- c++抛出异常方式与C语言的区别
- eclipse安装Spring插件
- 比较数组中最大值最小值
- 区块链应用开发入门
- 更改Yelee主题标签云为球形标签云
- request和response的转发、重定向、请求包含小细节
- Jni C/C++运行时遇到异常怎么办?捕获与抛出
- Javascript原型和原型链
- 判断闰年
- 一次完整的HTTP请求所经历的7个步骤
- 马云---下一个三十年企业家最重要的素质是什么?
- 【PAT甲级】1049. Counting Ones (30)
- django 1.8 官方文档翻译:logging
- Android快速自定义倒计时按钮
- EasyDarwin+ffmpeg进行PC(摄像头+麦克风)流媒体直播服务