从JNI代码中检查Java类中是否存在可选字段或方法

时间:2013-12-26 18:11:47

标签: java c++ c java-native-interface exists

我有一个Java类,可以在子类中添加一个额外的字段。有一个相应的C ++ JNI方法将与该字段进行交互。但是,我希望JNI代码同时处理基类和子类,这意味着它必须检测该字段是否存在。

我的(简化)JNI代码如下所示:

fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( fid == 0 ) return;
... continue with fid ...

虽然GetFieldID()方法返回NULL,但应用程序在处理的某个进一步的点处获得异常,这似乎与此代码无关。然而,它在某种程度上是相关的,因为如果我只是在GetFieldID()方法之前返回,则没有异常。

如何从JNI代码中可靠地测试对象中是否存在字段或方法?

1 个答案:

答案 0 :(得分:8)

事实证明,尽管GetFieldID()方法返回NULL,但还是生成了必须处理的Java异常。

解决方案是检查异常并清除(或处理)异常。最简单的解决方案是:

fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( JNI_TRUE == j.ExceptionCheck() ) {
    j.ExceptionClear();
    return;
}
... continue with fid ...