是否有从本机(C)代码访问Java对象字段的首选方法?

是否有从本机(C)代码访问Java对象字段的首选方法?,java,performance,java-native-interface,Java,Performance,Java Native Interface,我使用嵌入式JVM从用C编写的遗留应用程序中调用新的Java代码。我用Java编写了一个适配器层,以尽可能简化API,但它仍然必须通过JNI将带有字符串和int字段的POD对象返回给C代码。我想知道C代码是否有一种访问对象字段的推荐方法 假设我有一个Java类: class Pod { ... final int foobar; ... int getFoobar() { return foobar; } ... } 我应该调用getFoobar()访问

我使用嵌入式JVM从用C编写的遗留应用程序中调用新的Java代码。我用Java编写了一个适配器层,以尽可能简化API,但它仍然必须通过JNI将带有字符串和int字段的POD对象返回给C代码。我想知道C代码是否有一种访问对象字段的推荐方法

假设我有一个Java类:

class Pod {
    ...
    final int foobar;
    ...
    int getFoobar() { return foobar; }
    ...
}
我应该调用getFoobar()访问器方法吗

static jclass class = (*env)->FindClass(env, "my/package/Pod");
static jmethodID getFoobar_id = (*env)->GetMethodID(env, class, getFoobar, "()I");

jobject pod = ...;
jint foobar = (*env)->CallIntMethod(env, pod, getFoobar_id);
或者我应该直接访问foobar字段吗

static jclass class = (*env)->FindClass(env, "my/package/Pod");
static jfieldID foobar_field_id = (*env)->GetFieldId(env, class, "foobar", "I");

jobject pod = ...;
jint foobar = (*env)->GetIntField(env, pod, foobar_field_id);

我可以通过实验来确定一种方法是否比另一种更好,但我想知道是否有任何公认的行业标准做法?

两者都是有效的。我将使用以下规则来决定使用哪一个:如果不是使用C,而是使用java来实现遗留应用程序正在执行的活动,我会使用
getFoobar()
还是
foobar
?写下你想说的,而不是你认为计算机需要听到的

一般来说,遗留代码似乎正在使用Pod,而不是PODAPI的一部分,因此我希望它使用Pod的“公共”接口。通常这意味着像
getFoobar()
这样的成员,但由于您的特定示例是
final int
,因此不太清楚


如果性能是您最关心的问题,
GetIntField
将优于
CallIntMethod

两者都是有效的。我将使用以下规则来决定使用哪一个:如果不是使用C,而是使用java来实现遗留应用程序正在执行的活动,我会使用
getFoobar()
还是
foobar
?写下你想说的,而不是你认为计算机需要听到的

一般来说,遗留代码似乎正在使用Pod,而不是PODAPI的一部分,因此我希望它使用Pod的“公共”接口。通常这意味着像
getFoobar()
这样的成员,但由于您的特定示例是
final int
,因此不太清楚


GetIntField
将比
CallIntMethod
更出色,如果性能是您最关心的问题。

这正是我期望听到的。Pod类是Facade的一部分,我编写它是为了简化这个特定应用程序的JavaC接口。它可以是我想要的任何东西,这正是我期待听到的。Pod类是Facade的一部分,我编写它是为了简化这个特定应用程序的JavaC接口。它可以是我想要的任何东西。