[英]How to pass the image as a structure parameter to C function of libfprint using JNI
[英]UnsatisfiedLinkError using JNI for Native C Package libfprint
我想在我的最后一年項目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");
}
所以現在我正在瀏覽項目屬性並進入“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();
}
}
}
我正在使用Eclipse Juno的Ubuntu 11.10。
任何在這方面有輕松知識的人都會有很大的幫助!
我知道這有點晚了。 但是如果你正在為你的java項目使用eclipse,那么轉到Run Configurations
然后轉到Arguments
選項卡。
在VM arguments
添加以下行:
-Djava.library.path="${workspace_loc}/PROJECT_NAME/DIRECTORY_NAME_CONTAINIG_LIBRARY:${env_var:PATH}"
只要找到了解決辦法在這里 。 我確信這對一些人來說很明顯,但JNI對我來說是全新的。 解決方案是:
“在/etc/ld.so.conf.d/中創建一個名為.conf的新文件
編輯文件並為每個共享庫目錄(* .so文件)添加一行,它看起來像:
/ usr / lib / APPLICATION / lib重新加載系統范圍的庫路徑列表:sudo ldconfig“
我只想拋出幾個與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 :)的主要根本原因:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.