2016-07-06 42 views
1

我給出了一個用於訪問名片掃描器的DLL和JNI包裝器。JNI包裝的DLL只在從默認包中調用時才起作用

到目前爲止,我只能在所有類都在默認包中時調用API。當我嘗試將課程移到其他軟件包時,我得到一個UnsatisfiedLinkError

直到現在我還沒有JNI的經驗,並想知道是否需要重寫包裝器,以便能夠以不同的方式組織項目。我不能做的是使用默認包,因爲這意味着我將在那裏放置全部

的包裝看起來是這樣的:

public final class Wrapper { 
    private native int CRTK_Init(int[] lphRTK); 

    private int m_hRTK; 
    private int m_hRTKDB; 

    static 
    { 
     System.loadLibrary("crtk_jni"); 
    } 

    public Wrapper() { 
     m_hRTKDB = 0; 
     int[] pRTK = new int[1]; 
     CRTK_Init(pRTK); // UnsatisfiedLinkError here 
     m_hRTK = pRTK[0]; 
    } 
} 
+0

我想我們在這裏需要一些源代碼。直覺:你的JNI包裝器有問題。 – GhostCat

+0

@JornVernee更新了代碼片段 – paul

回答

2

與JNI的事情是,包含本地方法的類的完全合格的類名緊密地耦合到本機的方法簽名( C-)功能。

的C-簽名必須是這樣的

JNIEXPORT jobject JNICALL Java_packageName_className_methodName(JNIEnv * env, jclass parameter) 

重命名類或將其移動到另一個包會改變預期的函數名以及導致UnsatisfiedLinkError

那麼你能做什麼?

除非您有權訪問本機資源來更改函數名稱,否則與dll一起發佈的所有類都必須保留在default-package中,所有您自己的類都可以放到您想要的位置。

獲取在默認包中具有其本機方法的JNI包被認爲是不好的樣式,並且不適合接收軟件的質量。並且要爲使用默認軟件包AFAIR例如AFAIR tomcat有(有?)與那些問題。