我有一个Java类,可以在子类中添加一个额外的字段。有一个相应的C ++ JNI方法将与该字段进行交互。但是,我希望JNI代码同时处理基类和子类,这意味着它必须检测该字段是否存在。
我的(简化)JNI代码如下所示:
fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( fid == 0 ) return;
... continue with fid ...
虽然GetFieldID()方法返回NULL,但应用程序在处理的某个进一步的点处获得异常,这似乎与此代码无关。然而,它在某种程度上是相关的,因为如果我只是在GetFieldID()方法之前返回,则没有异常。
如何从JNI代码中可靠地测试对象中是否存在字段或方法?
答案 0 :(得分:8)
事实证明,尽管GetFieldID()方法返回NULL,但还是生成了必须处理的Java异常。
解决方案是检查异常并清除(或处理)异常。最简单的解决方案是:
fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( JNI_TRUE == j.ExceptionCheck() ) {
j.ExceptionClear();
return;
}
... continue with fid ...