Java 对本机C包libfprint使用JNI时出现不满意的链接错误

Java 对本机C包libfprint使用JNI时出现不满意的链接错误,java,java-native-interface,Java,Java Native Interface,我试图在我最后一年的项目中使用一个名为。这是一个开源的指纹阅读器SDK。我正在用Java做我的项目,所以我需要移植libfprint功能 我运气好,结果发现已经有人这么做了。名为的包是libfprint的JNI包装器 因此,我按照jlibfprint和libfprint中的说明进行设置。libfprint或多或少可以正常工作。至于jlibfprint,当我试图运行我得到的示例程序时 Exception in thread "main" java.lang.UnsatisfiedLinkError

我试图在我最后一年的项目中使用一个名为。这是一个开源的指纹阅读器SDK。我正在用Java做我的项目,所以我需要移植libfprint功能

我运气好,结果发现已经有人这么做了。名为的包是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)
现在我查看项目属性,找到“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();
        }
    }
}
我正在使用Ubuntu11.10和EclipseJuno

任何在这方面稍有知识的人都会帮上大忙

刚刚找到了解决办法。我相信这对一些人来说是显而易见的,但是JNI对我来说是全新的。解决办法是:

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

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

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


我只想给出一些与JNI相关的答案,请随意否决

这个电话需要看起来像

JNIEXPORT <return type> JNICALL Java_<your_package_name>_<classname>_<methodname>(JNIEnv *env, jobject obj, ...)
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)
应该是什么样子

JNIEXPORT <return type> JNICALL Java_<your_package_name>_<classname>_<methodname>(JNIEnv *env, jobject obj, ...)
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)

这是导致不满意链接错误的主要根本原因:)

我知道这有点晚了。但是如果您在java项目中使用eclipse,那么请转到
运行配置
,然后转到
参数
选项卡

VM参数中添加以下行:

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

更简单的是,您可以在Java中定义与libfprint中的函数签名相对应的接口,并使用JNA()避免额外的JNI库。嗯,从头开始有多快/轻松?我是一个完全的JNI新手,对C几乎一无所知。目前我不得不使用Linux,因为我的阅读器的唯一驱动程序在Linux上可用。您可以在几分钟内映射并使用本机库。作为练习,选择任何C库函数,为其编写映射,然后运行它。有关简单的C库示例,请参阅或。如果方法签名与导出的JNI调用不完全匹配,则可能会得到不满意的链接。正如您所知,包名是方法签名的一部分…定义
LD_LIBRARY_PATH
以包括到共享库的路径
java.library.path
主要基于该环境变量。无需重新启动或修改系统。