zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园所有,如有转载,需注明出处。

  • 相关阅读:
    GZDBHelper C#.NET开源的数据库访问组件
    判断页面是否是静态页面
    Web应用程序dll获取当前程序集路径问题
    webAPI 上传文件
    解决.Net Core3.0 修改cshtml代码之后必须重新生成才可以看到效果
    .net core使用LESS
    test
    JS实现线程锁(Promise),NodeJS并发锁处理
    参考护照编码实现算法JS生成带字母有序编码
    centos7防火墙开放端口与关闭防火墙
  • 原文地址:https://www.cnblogs.com/jianmu/p/7667241.html
Copyright © 2011-2022 走看看