NDk編譯opencv for Android,並引用在Unity3d遊戲中的一般步驟
阿新 • • 發佈:2017-10-14
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遊戲中的一般步驟