Toon posts:

[Java] native method call geeft de tweede keer een Exception

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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 ]


Verwijderd

Topicstarter
Ok, het is opgelost. De fout zat niet in bovenstaande code, maar in het feit dat ik een string pointer niet vrijgaf met (*env)->ReleaseStringUTFChars(env, jstring, cstring). Deze kan dicht...

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

[zeik mode]De modjes zijn op vakantie lijkt wel (no offence)[/zeik mode]

en WOW DAMN! is dit nog java :? ?
dat je hier nog wijs uit kunt. gelukkig heb je de oplossing al gevonden. GOOD WORK

WhatPulse! - Rosetta@Home - Docking@Home


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
KompjoeFriek schreef op 18 July 2003 @ 13:54:
[zeik mode]De modjes zijn op vakantie lijkt wel (no offence)[/zeik mode]
Want?
en WOW DAMN! is dit nog java :? ?
dat je hier nog wijs uit kunt. gelukkig heb je de oplossing al gevonden. GOOD WORK
Het is gewoon C code embed in Java om bepaalde methodes native te kunnen hebben. Het is dus geen java an sich.

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

Het is gewoon C code embed in Java om bepaalde methodes native te kunnen hebben. Het is dus geen java an sich.
Ok, ik begrijp. tenx voor de uitleg.

En ik zei dat de modjes op vakantie zijn omdat de topicstarter zelf om een slotje vraagt, en het is nu ondertussen 4,5 uur later
(was grappig bedoeld, ik weet ook wel dat jullie niet allemaal op vakantie zijn... vandaar)

WhatPulse! - Rosetta@Home - Docking@Home