2012-06-22 35 views
0

我想在Android 2.3.3中使用OpenCV 2.4.0本機代碼。爲此,我使用NDK release-8在Windows 7上使用ndk-build.cmd腳本構建lib.so共享庫。我使用Eclipse創建項目並生成.apk文件。在Android 2.3.3上使用OpenCv的本機代碼時拋出UnsatisfiedLinkError 2.3.3

這是問題所在,當我嘗試在Java代碼中使用System.loadLibrary(加載共享庫時,出現UnsatisfiedLinkError異常。我試着用NDK中的hello-jni樣品做同樣的事情,它工作得很好。

我遵照this page上的說明創建項目並編寫Android.mkApplication.mk文件。

這裏是我的Java代碼:

package my.package.ocvtest1 
// import android.foo.bar statements 

public class OCVTest1 extends Activity 
{ 

    public void onCreate(Bundle savedInstance) 
    { 
     super.onCreate(Bundle savedInstance) 
     // code to display strings returned by native functions 
    } 

    public native String funtionName1(); 
    public native String functionName2(); 

    static 
    { 
     System.loadLibrary("ocvtest1"); 
    } 

} 

這裏的(Project dir)/jni/ocvtest1.c文件,實現本機的功能:

#include <jni.h> 

// Other header files and some global variables 

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) 
{ 
    // code here 
} 

jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj) 
{ 
    // code here 
} 

// End of file 

我GOOGLE了這個問題,並試圖解決方案,甚至實現這些解決方案,我以後得到這個異常。這裏的一切我已經嘗試到現在的事情:

二手通過複製libopencv_java.so和靜態*.a庫文件到(Project dir)/libs(Project dir)/obj/local文件夾和改變Java源代碼的靜態塊

static 
{ 
    System.loadLibrary("opencv_java"); 
    System.loadLibrary("ocvtest"); 
} 

動態鏈接使用靜態鏈接通過添加OPENCV_LIB_TYPE:=STATIC產生如下圖所示

include $(CLEAR_VARS) 
OPENCV_LIB_TYPE:=STATIC 
include (<Path to Opencv.mk>) 

包括頭文件通過在命令執行javah.exe my.package.OCVTest1在使用動態鏈接時提示。

armeabi-v7a更改爲armeabiApplication.mk文件中的abi版本變量。

對於上述所有的變化,以確保庫文件加載到應用程序的lib文件夾,我執行

adb push <path to library on disk> <path to /lib in app> 

其複製的庫文件到手機上正確的目錄。

嘗試所有這些修復後,我仍然無法解決此異常。

回答

1

通過複製libopencv_java.so和靜態 * .A庫文件到(項目目錄)/庫和(項目目錄)/ OBJ /本地文件夾和Java源代碼更改的靜態塊中使用動態鏈接到

你必須只複製libopencv_java.so(無需*.a文件)(Project dir)/libs/armeabi-v7a

還你:

public native String funtionName1(); 

但在本地C代碼中有僅是這些功能:

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake? 
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj) 

看來,第一個函數的名稱是錯誤的。

這應該解決您的問題。

+1

我改變了第一個功能的名稱,然後嘗試在手機上運行應用程序,仍然拋出不滿意的鏈接錯誤異常。我嘗試了很多其他地方提到的修復失敗。我已經包含了由javah生成的頭文件,嘗試了動態鏈接,確保這些庫位於手機的正確路徑中。 –

+0

另外,雖然通過將「OPENCV_LIB_TYPE:= STATIC」行添加到Android.mk來嘗試靜態鏈接,但是這些庫不會生成,而是我看起來無休止的編譯時錯誤,我必須停止使用Ctrl + C。這是否意味着代碼中的某些差異?另外,我正在使用Windows 7,NDK的android開發者頁面表示它與Windows 7不兼容。這是問題嗎? –

+0

這是一些亂碼輸出I在談論的: (.text._Z25cvHaarDetectObjectsForROCPKvP23CvHaarClassifierCascadeP12CvM emStomake:*** [OBJ /本地/ armeabi-V7A/libocvtest3.so]錯誤3 終止批處理作業(Y/N)? y –