java - SDL_SetVideoMode 试图释放一个没有被 malloc 的指针(?)

标签 java c java-native-interface sdl

我写了一个 JNI 库,它在 Java 中是这样定义的:

public class SDLMain 
{
    static {System.loadLibrary("SDLBitsX");}

    public static native void init();
}

在 C 中定义为:

JNIEXPORT void JNICALL Java_gd_verfolgungsja_sdlbitsx_SDLMain_init(JNIEnv * env, jclass this)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Surface *screen = SDL_SetVideoMode(512, 512, 8, 0);
    SDL_FreeSurface(screen);
    SDL_Quit();
}

Java 代码吐出:

2013-03-29 22:34:01.796 java[10851:1303] _NSSetWindowTag, error clearing window tags (1000)
2013-03-29 22:34:01.797 java[10851:1303] _NSSetWindowTag, error setting window tags (1000)
2013-03-29 22:34:01.799 java[10851:1303] error [1000] getting window resolution
2013-03-29 22:34:01.799 java[10851:1303] Error [1000] setting resolution to 1
2013-03-29 22:34:01.800 java[10851:1303] error [1000] setting colorSpace to Color LCD colorspace
java(10851,0x107b58000) malloc: *** error for object 0x7fff8c03af01: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

如果我注释掉该功能,该功能将正常工作

SDL_Surface *screen = SDL_SetVideoMode(512, 512, 8, 0);
SDL_FreeSurface(screen);

我在使用 Mac。为什么要这样做?

最佳答案

我从来没有在 Mac 上使用过 SDL,但是你对 SDL_FreeSurface(screen) 的调用是无效的。(IIRC 你通常不会自己释放默认工作表面) SDL_Quit() 会自动释放默认绘图表面,因此在您的情况下,SQL_Quit() 正在尝试释放不存在的内容。

关于java - SDL_SetVideoMode 试图释放一个没有被 malloc 的指针(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15714361/

相关文章:

android - 如何在我的 android 应用程序中使用 ScreenShotClient

java - 是否可以将方法引用转换为 MethodHandle?

java - 如何使用java获取连接到计算机的USB设备的详细信息

java - 等待传感器数据 android - 我们总是需要一个新线程吗?

c - execvp() 不让我

c - pthread_self() 怎么总是成功?

java - 通过 JNI 在 Java 或 C++ 中实现矩阵运算?

java - JNI -> 如何包装 c++ void*

java - Spring RestTemplate,返回列表<String>

c - 为什么在我下面的例子中它只需要最后 4 位?