我想在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.mk
和Application.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
更改爲armeabi
爲Application.mk
文件中的abi版本變量。
對於上述所有的變化,以確保庫文件加載到應用程序的lib文件夾,我執行
adb push <path to library on disk> <path to /lib in app>
其複製的庫文件到手機上正確的目錄。
嘗試所有這些修復後,我仍然無法解決此異常。
我改變了第一個功能的名稱,然後嘗試在手機上運行應用程序,仍然拋出不滿意的鏈接錯誤異常。我嘗試了很多其他地方提到的修復失敗。我已經包含了由javah生成的頭文件,嘗試了動態鏈接,確保這些庫位於手機的正確路徑中。 –
另外,雖然通過將「OPENCV_LIB_TYPE:= STATIC」行添加到Android.mk來嘗試靜態鏈接,但是這些庫不會生成,而是我看起來無休止的編譯時錯誤,我必須停止使用Ctrl + C。這是否意味着代碼中的某些差異?另外,我正在使用Windows 7,NDK的android開發者頁面表示它與Windows 7不兼容。這是問題嗎? –
這是一些亂碼輸出I在談論的: (.text._Z25cvHaarDetectObjectsForROCPKvP23CvHaarClassifierCascadeP12CvM emStomake:*** [OBJ /本地/ armeabi-V7A/libocvtest3.so]錯誤3 終止批處理作業(Y/N)? y –