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

3

我知道这有点晚了。但是,如果您将 eclipse 用于您的 java 项目,请转到Run Configurations然后转到Arguments选项卡。

VM arguments添加以下行:

-Djava.library.path="${workspace_loc}/PROJECT_NAME/DIRECTORY_NAME_CONTAINIG_LIBRARY:${env_var:PATH}"
于 2013-08-02T14:40:38.550 回答
1

刚刚在这里找到了解决方案。我确信这对某些人来说是显而易见的,但 JNI 对我来说是全新的。解决方案是:

“在 /etc/ld.so.conf.d/ 中创建一个名为 .conf 的新文件

编辑文件并在共享库(*.so 文件)的每个目录中添加一行,它看起来像:

/usr/lib/APPLICATION/lib 重新加载系统范围的库路径列表:sudo ldconfig"

于 2012-12-05T01:31:53.233 回答
0

我只想抛出一些与 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 的主要原因 :)

于 2012-12-05T14:41:40.253 回答