[JAVA/JNI] Mogelijk geheugenprobleem

Pagina: 1
Acties:

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 01:32

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Dag allemaal, ik krijg deze heeele mooie error als ik via JNI een native method aanroep.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x78001da9, pid=1060, tid=984
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed mode, sharing)
# Problematic frame:
# C  [MSVCRT.dll+0x1da9]
#
# An error report file with more information is saved as hs_err_pid1060.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#


Die native method leest wat meuk uit een bestand en retourneert het dan als array.
Nou lijkt deze error verdacht veel op een geheugenfout (duh) en heb ik het gevoel dat het dezelfde fout is die je met C krijgt als je over de geheugengrenzen begint te wandelen (windows sluit je app).
Is het zo dat als je met JNI werkt dat je geen kopie krijgt van het geheugen maar dat je alleen maar een pointer krijgt en die array dus gewoon in het 'C geheugen' blijft bestaan?

Als dat zo is, kan ik dan dmv kopieën maken en de oude arrays wegflikkeren het geheugen vrijmaken?

Of zit ik helemaal in de verkeerde hoek te denken.

Voor alle replies: _/-\o_

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 09-04 20:19

Salandur

Software Engineer

geef even de relevante code uit je .java, .h en .c files. mss dat we dan zinnige antwoorden kunnen geven.

Assumptions are the mother of all fuck ups | iRacing Profiel


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 01:32

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Salandur schreef op vrijdag 24 februari 2006 @ 10:20:
geef even de relevante code uit je .java, .h en .c files. mss dat we dan zinnige antwoorden kunnen geven.
De code is niet relevant. Als je JNI kent begrijp je wat ik bedoel.

Ik retourneer een jobjectArray vol met strings (bv 688 strings).
Als ik die in Java ga uitlezen staat het object dan nog in dat C geheugenblok en moet ik het dus kopiëren en die in C vrijgeven, of staat hij gewoon in het JRE geheugen en ligt het probleem ergens anders?

Want als ik het array gewoon doorloop gebeurt er niets (for-loop).
Maar als ik er uit ga lezen dan crasht hij op een schijnbaar random punt.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Okee dan moet het zeker werken... ;)

Maar even serieus... het kan alleen een fout zijn in jouw code of in jouw configuratie... JNI doet het al jaren uitstekend, dus dat lijkt mij zeker wel relevant... maargoed als je niet geholpen wilt worden...

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 01:32

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
.c
C:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include "HelloWorld.h"

JNIEXPORT jobjectArray JNICALL
Java_HelloWorld_print(JNIEnv *env, jclass cls, jstring key)
{
// lezen van key voor selectie
    const jbyte *skey;
    skey = (*env)->GetStringUTFChars(env, key, NULL);
    if (skey == NULL) {
       printf("Geen key");
       return NULL;
    }
    strcpy(sInput, skey);

    jobjectArray result;
    jstring s;
    int n;
    
    jclass intArrCls = (*env)->FindClass(env, "java/lang/String");
    if (intArrCls == NULL) {
       printf("jammer joh\r\n");
    }
    
    result = (*env)->NewObjectArray(env, nItems, intArrCls, NULL);
    
    if (result == NULL) {
       printf("helaas\r\n");
    }

    for(n=0; n<nItems; n++)
    {
        s = (*env)->NewStringUTF(env, strs);
        (*env)->SetObjectArrayElement(env, result, n, s);
        strs = &strs[1+strlen(strs)];
    }

    return result;


Alleen de relevante delen

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8