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

时间:2014-07-08 20:09:43

标签: java performance java-native-interface

我正在使用嵌入式JVM从用C编写的遗留应用程序中调用新的Java代码。我已经用Java编写了一个适配器层来尽可能地简化API,但它仍然必须返回带有String的POD对象和int字段通过JNI到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);

我可以尝试找出一种方式是否比另一种更好,但我想知道是否有任何公认的行业标准做法?

1 个答案:

答案 0 :(得分:4)

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

一般来说,似乎遗留代码使用Pod,而不是Pod API的一部分,所以我希望它使用Pod的“公共”接口。通常这意味着getFoobar()之类的成员,但由于您的特定示例是final int,因此不太明确。

如果性能是您最关心的问题,

GetIntField将胜过CallIntMethod