Ik ben bezig met programmeren met JNI, waarbij ik een C-programma heb omgeklust tot shared library, aanroepbaar vanuit mijn java-code.
Het gewone C-programma twee of meer keer achter elkaar draaien is geen probleem.
De eerste keer dat ik de native code aanroep vanuit java gaat alles prima, de tweede keer geeft het de volgende foutmelding:
com.sun.jdi.VMDisconnectedExcetion: Got IOException from Virtual Machine occurred stepping in thread.
Het maakt niet uit of ik dit twee keer op hetzelfde object doe, of twee objecten instantieer en daar achter elkaar de native method call uitvoer (de tweede geeft dan problemen).
IK heb de indruk dat het met Local vs. Global refs te maken heeft, maar daar heb ik volgens mij met het volgende stukje code rekening mee gehouden:
I'm stumped... Iemand suggesties?
Het gewone C-programma twee of meer keer achter elkaar draaien is geen probleem.
De eerste keer dat ik de native code aanroep vanuit java gaat alles prima, de tweede keer geeft het de volgende foutmelding:
com.sun.jdi.VMDisconnectedExcetion: Got IOException from Virtual Machine occurred stepping in thread.
Het maakt niet uit of ik dit twee keer op hetzelfde object doe, of twee objecten instantieer en daar achter elkaar de native method call uitvoer (de tweede geeft dan problemen).
IK heb de indruk dat het met Local vs. Global refs te maken heeft, maar daar heb ik volgens mij met het volgende stukje code rekening mee gehouden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| (global vars):
static jclass cls = 0;
static jmethodID add_new_fface_ID;
static jmethodID push_bond_ID;
static jmethodID put_pbc_in_fface_ID;
static jmethodID put_pbc_in_pbcs_ID;
static jmethodID add_particle_ID;
static jmethodID display_message_ID;
(een boel c-code)
(in de JNI c-code:)
if (cls == 0) {
jclass cls1 = (*env)->GetObjectClass(env, obj);
if (cls1 == 0) {
printf("cls1 == 0");
return;
}
cls = (*env)->NewGlobalRef(env, cls1);
if (cls == 0) {
printf("cls == 0");
return;
}
add_new_fface_ID = (*env)->GetMethodID(env, cls, "addNewFface", "(IIID)V");
push_bond_ID = (*env)->GetMethodID(env, cls, "pushBond", "(IIIIIII)V");
put_pbc_in_fface_ID = (*env)->GetMethodID(env, cls, "putPBCinFface", "(I)V");
put_pbc_in_pbcs_ID = (*env)->GetMethodID(env, cls, "putPBCinPBCs", "()V");
add_particle_ID = (*env)->GetMethodID(env, cls, "addNewParticle", "(IIII)V");
display_message_ID = (*env)->GetMethodID(env, cls, "displayMessage", "(C)V");
} |
I'm stumped... Iemand suggesties?
[ Voor 53% gewijzigd door Verwijderd op 17-07-2003 11:13 ]