我正在使用嵌入式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);
我可以尝试找出一种方式是否比另一种更好,但我想知道是否有任何公认的行业标准做法?
答案 0 :(得分:4)
两者都有效。我将使用以下规则来决定使用哪个:如果我使用Java来实现遗留应用程序正在执行的活动,而不是使用C,我会使用getFoobar()
还是foobar
?写下您想说的内容,而不是您认为计算机需要听到的内容。
一般来说,似乎遗留代码使用Pod,而不是Pod API的一部分,所以我希望它使用Pod的“公共”接口。通常这意味着getFoobar()
之类的成员,但由于您的特定示例是final int
,因此不太明确。
GetIntField
将胜过CallIntMethod
。