gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:30:02 24 4
gpt4 key购买 nike

我正在使用嵌入式 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);

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

最佳答案

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

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

GetIntField将超越CallIntMethod如果性能是您最关心的问题。

关于java - 是否有从 native (C) 代码访问 Java 对象字段的首选方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24640885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com