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

  • 相关阅读:
    201521044091《Java程序设计》第7周学习总结
    201521044091《java程序设计》第四次总结
    201521044091 《java程序设计》第八周学习总结
    201521044091 《Java程序设计》第5周学习总结
    201521044091 《Java程序设计》第2周学习总结
    201521044091 《Java程序设计》第3周学习总结
    MySQL设置字符集CHARACTER SET
    Create My MySQL configuration by Percona
    How to use jQuery to manipulate Cookies
    How to use OpenXml to import xml data to Sql server
  • 原文地址:https://www.cnblogs.com/jianmu/p/7667241.html
Copyright © 2011-2022 走看看