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


本文使用: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的信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM