我正在尝试在我的最后一年项目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。
任何对这方面有一丝了解的人都会有很大的帮助!
答案 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的主要根本原因:)