• 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 <opencv2opencv.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的信息。

    作者: 建木
    出处: http://www.cnblogs.com/jianmu/
    本文版权归作者和博客园所有,如有转载,需注明出处。

  • 相关阅读:
    阿里云盘上线了,使用中,1T空间,不限速(似乎)!
    在互联网大厂实习,虽然转正了,但编程能力很差,要主动离职吗?
    软件外包商都是黑心的吗?
    招聘信息薪资范围是12-20K,能否要20K的薪资?
    为何没有中文编程?
    为什么银行的IT部门都远离市区?
    想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗
    Java基础总结,超级全的面试题
    一套基于java的开源车牌识别算法
    Java 最常见的 208 道面试题(第八模块答案)网络
  • 原文地址:https://www.cnblogs.com/jianmu/p/7667241.html
Copyright © 2020-2023  润新知