1. 程式人生 > >NDk編譯opencv for Android,並引用在Unity3d遊戲中的一般步驟

NDk編譯opencv for Android,並引用在Unity3d遊戲中的一般步驟

ret app sset cpp unity3d 環境 ptr small var

本文使用:Unity3d + opencv + Android Unity3d中可以調用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 := aropencv LOCAL_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 -fexceptions APP_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遊戲中的一般步驟