Java JNI-GetObjectField返回NULL
我目前正在致力于安卓系统的实现 我有一个java类,看起来是这样的:Java JNI-GetObjectField返回NULL,java,android,java-native-interface,Java,Android,Java Native Interface,我目前正在致力于安卓系统的实现 我有一个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
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的本机JNI函数,它将写入VentriloEventData类实例中的字段。不管它值多少钱,它是用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;
}
上面的代码可以很好地写入type字段(没有被_pcm类包装)。调用getevent后,在java端验证data.type为1234:)
我的问题是断言“pcm!=NULL”将失败。请注意,pcm_字段!=NULL,这可能表示该字段的签名是正确的。。。所以我对GetObjectField的调用一定有问题。不过,如果我把它和那辆车比较一下,看起来还不错
在过去的两个小时里,我一直对这个问题耿耿于怀,现在我有点绝望了。。希望不同的观点能帮助我解决这个问题
edit1:这不适用于任何嵌套对象,即使是简单的“Ljava/lang/String;”将失败。edit2:ExceptionOccurrend和ExceptionCheck都返回JNI\u FALSE。
edit3:也不能处理静态字段。如果这是完整的代码,那么我猜
pcm
应该是NULL
。对象<代码> PCM < /COD>从未实例化,既不在java方面,也不在C++方面。p> 哦,哇,那太尴尬了。我用C++的思维方式思考,在这里,“pcm PCM”只是指对象是在堆栈上创建的…那应该是_pcm=new _pcm()。尽情欢笑,享受300代表的奖金;)