gpt4 book ai didi

java - JNI - GetObjectField 返回 NULL

转载 作者:太空狗 更新时间:2023-10-29 16:25:26 25 4
gpt4 key购买 nike

我目前正在研究 Mangler's安卓实现。

我有一个看起来像这样的 java 类:

public class VentriloEventData {
public short type;
public class _pcm {
public int length;
public short send_type;
public int rate;
public byte channels;
};
_pcm pcm;
}

我的 pcm 对象的签名:

$ javap -s -p VentriloEventData
...
org.mangler.VentriloEventData$_pcm pcm;
Signature: Lorg/mangler/VentriloEventData$_pcm;

我正在实现一个名为 getevent 的 native JNI 函数,它将写入 VentriloEventData 类实例中的字段。对于它的值(value),它在 Java 中是这样定义和调用的:

public static native int getevent(VentriloEventData data);
VentriloEventData data = new VentriloEventData();
getevent(data);

还有我的 getevent 的 JNI 实现:

JNIEXPORT jint JNICALL Java_org_mangler_VentriloInterface_getevent(JNIEnv* env, jobject obj, jobject eventdata) {
v3_event *ev = v3_get_event(V3_BLOCK);
if(ev != NULL) {
jclass event_class = (*env)->GetObjectClass(env, eventdata);

// Event type.
jfieldID type_field = (*env)->GetFieldID(env, event_class, "type", "S");
(*env)->SetShortField(
env,
eventdata,
type_field,
1234
);

// Get PCM class.
jfieldID pcm_field = (*env)->GetFieldID(env, event_class, "pcm", "Lorg/mangler/VentriloEventData$_pcm;");
jobject pcm =
(*env)->GetObjectField(
env,
eventdata,
pcm_field
);
jclass pcm_class = (*env)->GetObjectClass(env, pcm);

// Set PCM fields.
jfieldID pcm_length_field = (*env)->GetFieldID(env, pcm_class, "length", "I");
(*env)->SetIntField(
env,
pcm,
pcm_length_field,
1337
);

free(ev);
}
return 0;
}

上面的代码可以很好地写入类型字段(没有被 _pcm 类包装)。调用 getevent 后,data.type 在 java 端被验证为 1234 :)

我的问题是断言“pcm != NULL”会失败。请注意 pcm_field != NULL,这可能表明该字段的签名是正确的......所以我对 GetObjectField 的调用一定有问题。如果我将它与 official JNI docs 进行比较,它看起来不错.

在过去的 2 个小时里,我一直在为这个问题而苦苦思索,现在我有点绝望了.. 希望不同的观点能帮助我解决这个问题。

edit1:这不适用于任何嵌套对象,即使是简单的“Ljava/lang/String;”会失败。
edit2:ExceptionOccurred 和 ExceptionCheck 都返回 JNI_FALSE。
edit3:也不适用于静态字段。

最佳答案

好吧,如果这是完整的代码,那么我猜 pcm 应该NULL。对象 pcm 从未被实例化,无论是在 Java 端还是在 C++ 端。

关于java - JNI - GetObjectField 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479353/

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