在JNI中如何检测指定Java类是否存在?
JNI检测Java类存在性的正确实现
原代码问题根因
FindClass在未找到目标类时会先抛出ClassNotFoundException异常,同时返回NULL。如果不提前处理该异常,JNI运行时会直接抛出错误,不会走到后续的NULL判断分支,这是运行时报错的直接原因。
正确实现步骤
- 调用
FindClass后先检测是否有JNI异常抛出 - 若检测到异常,立即清除异常,再判定类不存在
- 无异常的情况下追加NULL判断,覆盖极端边界场景
- 类存在的场景下,使用完
jclass后要释放局部引用
代码示例
jclass targetCls = env->FindClass("com/test/app"); jboolean classExists = JNI_TRUE; // 优先检测是否有类不存在的异常抛出 if (env->ExceptionCheck()) { // 清除异常,避免影响后续JNI调用 env->ExceptionClear(); classExists = JNI_FALSE; } // 兜底空指针判断 else if (targetCls == NULL) { classExists = JNI_FALSE; } if (!classExists) { Log("Not found"); return 0; } // 类存在的后续业务逻辑 // ... // 释放局部引用,避免内存溢出 env->DeleteLocalRef(targetCls);
注意事项
- 类名必须符合JNI命名规范:包名的
.替换为/,内部类用$和外部类分隔,例如com/test/App$InnerClass - 子线程调用JNI时需要先执行
AttachCurrentThread绑定JVM,否则会找不到自定义的业务类 - 所有JNI调用出现异常后必须先清除异常,才能执行后续的其他JNI操作
内容的提问来源于stack exchange,提问作者Kezumi Miioki
相关产品推荐
相关产品推荐

