无法理解这个 UnsatisfiedLinkError
Can't understand this UnsatisfiedLinkError
为 C SDL 库创建 java 包装器时出现此异常:
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 调用者(第一种方法完成得很好并且在 java/c++ 两边看起来 100% 相似):
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);
原生Java函数:
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++ 实现:
JNIEXPORT jobject JNICALL Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer(JNIEnv *env, jclass , jobject win, jint index, jint flags) {
cout << "Create renderer: " << endl;
}
不明白为什么它不起作用,请你帮忙。
干杯
如果您有重载方法,则需要有 "full" JNI 方法名称。
方法名还应包括参数类型(以便 JNI 区分重载方法)
JNIEXPORT jobject JNICALL Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer__Lcom_sdl4j_window_SDL_1Window_2II
(JNIEnv *, jclass, jobject, jint, jint);
从技术上讲,它是相同的方法名称,然后添加 2 个下划线和参数类型。
_ = /
_1 = _
_2 = ;
_00024 = $
为 C SDL 库创建 java 包装器时出现此异常:
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 调用者(第一种方法完成得很好并且在 java/c++ 两边看起来 100% 相似):
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);
原生Java函数:
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++ 实现:
JNIEXPORT jobject JNICALL Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer(JNIEnv *env, jclass , jobject win, jint index, jint flags) {
cout << "Create renderer: " << endl;
}
不明白为什么它不起作用,请你帮忙。
干杯
如果您有重载方法,则需要有 "full" JNI 方法名称。
方法名还应包括参数类型(以便 JNI 区分重载方法)
JNIEXPORT jobject JNICALL Java_com_sdl4j_renderer_SDL_1Renderer_SDL_1CreateRenderer__Lcom_sdl4j_window_SDL_1Window_2II
(JNIEnv *, jclass, jobject, jint, jint);
从技术上讲,它是相同的方法名称,然后添加 2 个下划线和参数类型。
_ = /
_1 = _
_2 = ;
_00024 = $