所以我已经将这个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次迭代后事情会停止工作?