是否有从本机(C)代码访问Java对象字段的首选方法?
我使用嵌入式JVM从用C编写的遗留应用程序中调用新的Java代码。我用Java编写了一个适配器层,以尽可能简化API,但它仍然必须通过JNI将带有字符串和int字段的POD对象返回给C代码。我想知道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()访问
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接口。它可以是我想要的任何东西。