尝试运行本机库时EXCEPTION_ACCESS_VIOLATION?

时间:2015-03-24 21:02:16

标签: java c++ java-native-interface mingw mingw-w64

所以我已经将这个native library here编译成了一个带有MinGW的.so文件(64位版本,Eclipse对我大肆宣传试图运行32位版本)。

我能够成功地加载它并从中调用一个函数,但是一旦我调用一个函数我就会收到这个错误:

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000672434fd, pid=6932, tid=5628

JRE version: Java(TM) SE Runtime Environment (7.0_67-b01) (build 1.7.0_67-b01)

Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode windows-amd64 compressed oops)

Problematic frame: C  [gifflen.so+0x34fd]

所以我不确定该怎么做。我假设它有一些32位,64位的问题?很可能不是,但这只是我的猜测。

日志文件很大,所以我不确定相关的是什么。这是一部分:

Stack: [0x000000000e720000,0x000000000e820000],  sp=0x000000000e81efc0,  free space=1019k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [gifflen6.so+0x34fd]
C  [gifflen6.so+0x2400]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.jiggawatt.giffle.Giffle.AddFrame([I)I+0
j  org.jiggawatt.giffle.Giffle.addFrame([I)V+2
... (etc) ...
j  com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop()V+684
j  com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run()V+27
v  ~StubRoutines::call_stub

似乎崩溃发生在原生的 AddFrame()函数中?如果是这样,这不是第一个被调用的函数,之前调用 Init(),显然不会导致崩溃?


编辑,崩溃的来源?:

所以我得到了 printf()的工作,可以看到事件的进展。

本机 Init()函数运行,没问题。

原生函数 AddFrame()也会运行很长时间,直到它达到:

// ...

printf("gifflen: checkpoint\n");

i = 0;
while (i < samplepixels) {
    printf("\ngifflen: in loop at %o (1)\n", i);
    /*b = p[0] << netbiasshift;
    g = p[1] << netbiasshift;
    r = p[2] << netbiasshift;*/
    b = (((*p)) & 0xff) << netbiasshift;
    g = (((*p) >> 8) & 0xff) << netbiasshift;
    r = (((*p) >> 16) & 0xff) << netbiasshift;
    j = contest(b,g,r);

    printf("gifflen: still in loop (2)\n");
    altersingle(alpha,j,b,g,r);
    if (rad) alterneigh(rad,j,b,g,r);   /* alter neighbours */
    printf("gifflen: still in loop (3)\n");
    p += step;
    if (p >= (unsigned int *)lim) p -= lengthcount;
    printf("gifflen: still in loop (4)\n");
    i++;
    if (i%delta == 0) {
        alpha -= alpha / alphadec;
        radius -= radius / radiusdec;
        rad = radius >> radiusbiasshift;
        if (rad <= 1) rad = 0;
        for (j=0; j<rad; j++)
            radpower[j] = alpha*(((rad*rad - j*j)*radbias)/(rad*rad));
    }
    printf("gifflen: still in loop (5)\n");
}

// ...

日志如下所示:

gifflen: checkpoint

gifflen: in loop at 0 (1)
gifflen: still in loop (2)
gifflen: still in loop (3)
gifflen: still in loop (4)
gifflen: still in loop (5)

// ...

gifflen: in loop at 714 (1)
gifflen: still in loop (2)
gifflen: still in loop (3)
gifflen: still in loop (4)
gifflen: still in loop (5)

gifflen: in loop at 715 (1)
gifflen: still in loop (2)
gifflen: still in loop (3)
gifflen: still in loop (4)
gifflen: still in loop (5)

gifflen: in loop at 716 (1)
*crash*

迭代在716崩溃,而samplepixels为230400(640 x 360 gif size = 230400像素)。

不确定这是否意味着什么,但在Eclipse控制台中,&#34;致命错误&#34;崩溃打印首先出现,然后我上面发布的所有日志都在它之后。 (它不会先于它,这会更有意义。)

不明白为什么在716次迭代后事情会停止工作?

0 个答案:

没有答案