標籤:http rtt .com oca mic ted show err call
本文使用:Unity3d + opencv + AndroidUnity3d中可以調用opencv 編譯好的.so 動態庫,在產生Android apk時可以正常運行。 因為Android系統是基於Linux的,所以不能使用windows編譯串連的dll動態庫,必須使用.so動態庫,CPU架構為ARMv7。 一.打包自己的test.cpp的源碼1)首先下載與自己使用opencv版本相同的opencv for android複製sdk/native目錄到自己的工作目錄。比如 E:/ARso。在sdk/native/libs中存在已經編譯好的.a檔案,各種CPU架構的都有在sdk/native /jni中有OpenCV.mk,用與將這些.a靜態庫打包為.so動態庫的設定檔 2)在工作目錄E:/ARso中建立目錄 jni
3)在jni中建立兩個設定檔,以及拷貝自己需要編譯成.so的源碼檔案 4)Android.mk如下:LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) OPENCV_LIB_TYPE=STATIC include E:/work/ARso/sdk/native/jni/OpenCV.mk LOCAL_MODULE := aropencvLOCAL_CFLAGS := -Werror LOCAL_SRC_FILES := ar.cpp #LOCAL_LDLIBS += -llog -landroid -lEGL -lGLESv1_CM LOCAL_LDLIBS += -llog #build dynamic library include $(BUILD_SHARED_LIBRARY) 5)Application.mk如下:APP_STL := gnustl_static#PP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi armeabi-v7a#APP_PLATFORM := android-8 6)ar.cpp代碼如下:// ar.cpp : 定義 DLL 應用程式的匯出函數。// //#include<iostream> #include <opencv2\opencv.hpp> using namespace cv; extern "C"{ //int addf(int x, int y)//{// return x + y;//} int show() { IplImage* img1 = cvCreateImage(cvSize(320, 180), IPL_DEPTH_8U, 3); uchar r1, g1, b1; for (int i = 0; i < img1->height; i++) { uchar *ptrImage = (uchar*)(img1->imageData + i * img1->widthStep); //uchar *ptrDst = (uchar*)(img->imageData + i * img->widthStep); for (int j = 0; j < img1->width; j++) { ptrImage[3 * j + 0] = 255; ptrImage[3 * j + 1] = 0; ptrImage[3 * j + 2] = 0; } } Mat img2 = cvarrToMat(img1); // 在視窗中顯示遊戲原畫 //imshow("img2",img2); // 等待6000 ms後視窗自動關閉 return img2.rows; } } 5)使用ndk-build命令編譯ar.cpp為.so檔案。在使用ndk之前需要配置環境變數。在E:/ARso/jni目錄中運行 ndk-build
說明編譯成功,會在ARso/libs目錄中產生兩種CPU架構的.so動態庫libopencv.so 6)在Unity3d中使用。將libopencv.so拷貝到Unity3d中:在Assets目錄下建立目錄 Plugins/Android,拷貝至此 在代碼中加入: [DllImport( "aropencv")] private static extern int show(); 在調用時直接調用show()即可 7)Unity Build 為Android程式包。使用adb logcat -s Unity可以查看是否有報錯日誌 列印錯誤資訊以及Debug.Log的資訊。
NDk編譯opencv for Android,並引用在Unity3d遊戲中的一般步驟