2012-12-05 17 views
3

我正在嘗試在我最後一年的項目中使用一個包,名爲libfprint。這是一個開源的指紋識別器SDK。我正在做我的項目在Java中,所以我需要移植的libfprint功能。將JNI用於本地C包的UnsatisfiedLinkError libfprint

幸運的一擊打我,結果有人已經這樣做了。名爲jlibfprint的包是用於libfprint的JNI包裝。

所以我按照jlibfprint和libfprint中的說明進行設置。 libfprint或多或少的工作正常。至於jlibfprint,當我試圖運行我的示例程序,

Exception in thread "main" java.lang.UnsatisfiedLinkError: no JlibFprint_jni in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:840) 
    at java.lang.System.loadLibrary(System.java:1047) 
    at JlibFprint.<clinit>(JlibFprint.java:28) 
    at SampleRun.main(SampleRun.java:30) 

JlibFprint。(JlibFprint.java:28)

指的是

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

所以現在我正在瀏覽項目屬性並轉到「本地庫位置」字段,並將其指向包含的目錄,該目錄名爲libJlibFprint_jni.so

現在,當我運行程序時,我得到的錯誤是,

Exception in thread "main" java.lang.UnsatisfiedLinkError: JlibFprint.enroll_finger()LJlibFprint$fp_print_data; 
    at JlibFprint.enroll_finger(Native Method) 
    at SampleRun.main(SampleRun.java:36) 
Enroll the first finger... 

下面是示例Java文件

SampleRun.java

public class SampleRun { 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     JlibFprint jlibfprint = new JlibFprint(); 
     JlibFprint.fp_print_data pd1, pd2; 
     int matchValue; 
     try 
     { 
      System.out.println("Enroll the first finger..."); 
      pd1 = jlibfprint.enroll_finger(); 
      System.out.println("Compare the previous acquisition with the next one..."); 
      pd2 = jlibfprint.enroll_finger(); 
      matchValue = JlibFprint.img_compare_print_data(pd1, pd2); 

      System.out.println(matchValue); 
      if (matchValue > JlibFprint.BOZORTH_THRESHOLD) 
      { 
       System.out.println("[OK] The two fingerprints are compatible!"); 
      } 
      else 
      { 
       System.out.println("[FAIL] The two fingerprints are not compatible!"); 
      } 
     } 
     catch (JlibFprint.EnrollException e) 
     { 
      System.err.format("Enroll Exception [%d]\n", e.enroll_exception); 
      e.printStackTrace(); 
     } 
    } 
} 

我使用Ubuntu 11.10與Eclipse Juno。

任何有這方面知識的人都會很有幫助!

+1

更容易,你可以在Java定義接口對應功能libfprint簽名,避免使用JNA額外的JNI庫(http://github.com/twall/JNA)。 – technomage

+0

嗯,如何快速/無痛地開始從頭開始?我是一個完全JNI newb,並且幾乎沒有C的知識。.. – TomSelleck

+0

目前我必須使用Linux,因爲我的閱讀器只有驅動程序可用於Linux – TomSelleck

回答

1

剛剛找到解決方案here。我確信這對某些人來說顯而易見,但JNI對我來說是全新的。解決的辦法是:

「創建/etc/ld.so.conf.d/一個新的文件名爲.conf文件

編輯文件和每個共享庫的目錄(添加一行*的.so 文件),它看起來像:

/usr/lib目錄/應用/ lib目錄刷新全系統庫路徑列表: 須藤LDCONFIG」

+0

剛剛重新啓動,返回到unsatisfiedlink ..... :( – TomSelleck

+2

定義'LD_LIBRARY_PATH'以包含共享庫的路徑。路徑「主要基於該環境變量。不需要重新啓動也不需要進行系統修改。 – technomage

0

我只是要丟幾個JNI相關的答案,隨時downvote。

Android Java JNI and C Char array Can't recognize the value

的呼叫需要看起來像

JNIEXPORT <return type> JNICALL Java_<your_package_name>_<classname>_<methodname>(JNIEnv *env, jobject obj, ...) 

所以讓我們嘗試一下的一個例子是

package com.rtrk.demo; 
public class PELib 
{ 

    public native int play(String file, String file2, blahblah); 
/* ... */ 
} 

它應該像

JNIEXPORT jint JNICALL Java_com_rtrk_demo_PELib_play(JNIEnv *env, jobject obj, jstring main_video, jstring prev_video, jint main_x, jint main_y, jint main_width, jint main_height, jint prev_x, jint prev_y, jint prev_width, jint prev_height) 

這是導致UnsatisfiedLinkErrors的主要原因:)

3

我知道這有點晚了。但是如果你正在爲你的java項目使用eclipse,那麼去Run Configurations然後去Arguments標籤。

VM arguments添加以下行:

-Djava.library.path="${workspace_loc}/PROJECT_NAME/DIRECTORY_NAME_CONTAINIG_LIBRARY:${env_var:PATH}"