Search code examples
javajava-native-interface

Can't understand this UnsatisfiedLinkError


Getting this exception when creating a java wrapper for C SDL library:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sdl4j.renderer.SDL_Renderer.SDL_CreateRenderer(Lcom/sdl4j/window/SDL_Window;II)Lcom/sdl4j/renderer/SDL_Renderer;

Java Caller (1st method completes fine and looks 100% similar on both java/c++ sides):

    SDL_Window win = SDL_CreateWindow("Hello World!", 0, 0, 1024, 768, SDL_WindowFlags.SDL_WINDOW_SHOWN);
    SDL_Renderer ren = SDL_CreateRenderer(win, -1, SDL_RendererFlags.SDL_RENDERER_ACCELERATED | SDL_RendererFlags.SDL_RENDERER_PRESENTVSYNC);

Native Java function:

public static native SDL_Renderer SDL_CreateRenderer(SDL_Window window, int index, int flags);

C header:

* Class:     com_sdl4j_renderer_SDL_Renderer
* Method:    SDL_CreateRenderer
* Signature:    (Lcom/sdl4j/window/SDL_Window;II)Lcom/sdl4j/renderer/SDL_Renderer;
*/
JNIEXPORT jobject JNICALL     Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer
(JNIEnv *, jclass, jobject, jint, jint);

C++ implementation:

JNIEXPORT jobject JNICALL    Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer(JNIEnv *env, jclass ,    jobject win, jint index, jint flags) {

cout << "Create renderer: " << endl;
}

Can't see why it doesn't work, can you please help.

Cheers


Solution

  • If you have an overloaded method, you need to have the "full" JNI method name.
    The method name should also include the arguments types (so JNI can distinguish between the overloaded methods)

    JNIEXPORT jobject JNICALL     Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer__Lcom_sdl4j_window_SDL_1Window_2II
    (JNIEnv *, jclass, jobject, jint, jint);
    

    Technically it's the same method name, then you add 2 underscores and the argument types.

    _      = /
    _1     = _
    _2     = ;
    _00024 = $