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