簡體   English   中英

使用JNI for Native C Package libfprint的UnsatisfiedLinkError

[英]UnsatisfiedLinkError using JNI for Native C Package libfprint

我想在我的最后一年項目libfprint中使用一個包。 這是一個開源指紋識別器SDK。 我正在用Java完成我的項目,所以我需要移植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");
 }

所以現在我正在瀏覽項目屬性並進入“Native library location”字段,並將其指向包含名為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();
        }
    }
}

我正在使用Eclipse Juno的Ubuntu 11.10。

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

我知道這有點晚了。 但是如果你正在為你的java項目使用eclipse,那么轉到Run Configurations然后轉到Arguments選項卡。

VM arguments添加以下行:

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

只要找到了解決辦法在這里 我確信這對一些人來說很明顯,但JNI對我來說是全新的。 解決方案是:

“在/etc/ld.so.conf.d/中創建一個名為.conf的新文件

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

/ usr / lib / APPLICATION / lib重新加載系統范圍的庫路徑列表:sudo ldconfig“

我只想拋出幾個與JNI相關的答案,隨意投票。

Android Java JNI和C Char數組無法識別該值

電話需要看起來像

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 :)的主要根本原因:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM