使用JNI for Native C Package libfprint的UnsatisfiedLinkError

时间:2012-12-05 00:27:17

标签: java java-native-interface

我正在尝试在我的最后一年项目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。

任何对这方面有一丝了解的人都会有很大的帮助!

3 个答案:

答案 0 :(得分:3)

我知道这有点晚了。但是如果你在你的java项目中使用eclipse,那么转到Run Configurations,然后转到Arguments标签。

VM arguments添加以下行:

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

答案 1 :(得分:1)

刚刚找到解决方案here。我确信这对一些人来说很明显,但JNI对我来说是全新的。解决方案是:

  

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

的新文件      

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

     

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

答案 2 :(得分:0)

我只想抛出一些与JNI相关的答案,随时可以投票。

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