2015-05-06 26 views
0

對於C SDL庫創建一個Java包裝時,遇到了這樣的例外:無法理解這樣的UnsatisfiedLinkError

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來電(第1種方法完成罰款,並期待雙方的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頭:

* 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; 
} 

不明白爲什麼它不工作,你可以請幫忙。

乾杯

+0

您是否有SDL_CreateRenderer方法的重載? –

+0

剛剛搜索了代碼庫,不,只有1個定義。 –

+0

你用'javah'生成了這個東西嗎?如果沒有,那麼做,並相應地調整C代碼。 – EJP

回答

0

如果你有一個重載的方法,你需要有「充分」 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 = $