2012-08-12 103 views
0

我正在嘗試使用CardScan SDK中的Java示例數據庫程序。JNI UnsatisfiedLinkError-如何正確加載庫?

我正在使用位於Java/JNI和Java /數據庫中的文件。該程序必須使用32位JRE運行。我可以在64位機器上卸載Java並安裝32位版本,然後重新添加Java系統路徑。我可以通過雙擊SDKData.bat文件成功運行程序並與CardScan數據庫文件(.cdb)進行接口,但是當我打開源文件進行編輯並編輯Java.library.path以包含所需的庫(CRTK_JNI .DLL),我得到UnsatisfiedLinkErrors無處不在:

Exception in thread "main" java.lang.UnsatisfiedLinkError: sdkdata.CRTK.CRTK_Init([I)I
at sdkdata.CRTK.CRTK_Init(Native Method)
at sdkdata.CRTK.(CRTK.java:239)
at sdkdata.SDKData.(SDKData.java:97)
at sdkdata.SDKData.main(SDKData.java:643)
Java Result: 1

據推測,這種情況正在發生,因爲該庫沒有正確加載。

我需要做什麼才能以滿負荷運行和編輯程序(使用來自CRTK_JNI的所有原生函數的工作順序)?

+0

那麼,庫中有什麼非綁定符號? – 2012-08-12 18:02:11

+0

@DonalFellows以下是我認爲不受限制的所有內容: http://pastebin.com/5vsxty5e – blastb 2012-08-12 18:18:22

+1

您不會將DLL放入java.library.path中。你把包含DLL的目錄。 – bmargulies 2012-08-12 20:34:21

回答

0

爲了說明這個Java示例程序在CardScan API中是不受支持的 - 嘗試使用不支持的語言來完全依賴於實驗性實現來使用API​​是一個壞主意。我最終使用了一種支持的語言(Visual Basic)來使用SDK;如果看到這個問題的人碰巧正在使用CardScan API,here是我在Github上的VB實現。

2

Presumably this is happening because the library is not loading properly.

恰恰相反。庫加載完成。你沒有得到的是從System.load()/loadLibrary()電話,你在呼喚你的本地方法時收到錯誤,應該有簽名的一個:

package sdkdata; 

public class CRTK 
{ 
    public native int CRTK_Init(int[]); 
} 

所以它不存在,或者您已經更改了簽名無需重新生成.h和.c文件,或者您已經以其他方式手動修改了聲明。

發佈您的代碼。

+0

我確實發佈了我的代碼,但由於某種原因它被編輯者刪除了。可能應該更多關注問題規則,對此很抱歉。 – blastb 2013-01-22 20:57:55