3

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");
 }

そこで、プロジェクトのプロパティを調べて、「ネイティブ ライブラリの場所」フィールドに到達し、それを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 を使用しています。

この分野の知識があれば誰でも大助かりです!

4

3 に答える 3

1

ここで解決策を見つけました。一部の人には明らかだったと思いますが、JNIはまったく新しいものです。解決策は次のとおりです。

"/etc/ld.so.conf.d/に.confという名前の新しいファイルを作成します

ファイルを編集し、共有ライブラリ(* .soファイル)のディレクトリごとに1行追加すると、次のようになります。

/ usr / lib / APPLICATION / libシステム全体のライブラリパスのリストをリロードします:sudo ldconfig "

于 2012-12-05T01:31:53.233 に答える
0

JNI関連の回答をいくつか投げるだけです。気軽に反対票を投じてください。

AndroidJavaJNIおよびCChar配列が値を認識できません

通話は次のようになります

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の主な根本原因です:)

于 2012-12-05T14:41:40.253 に答える