本文使用: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游戏中的一般步骤的更多相关文章

  1. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  2. 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    原文网址:http://blog.csdn.net/hxdanya/article/details/39371759 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题. ...

  3. 在fedora25x86下编译opencv的Android版本的过程记录

    准备材料: 1. 32位的Fedora25(不建议使用64位系统----64位系统下也是可以编译的,这里为了简单起见,考虑使用32位操作系统.事实上,本人在64位操作系统下也做了尝试,也完成了编译.) ...

  4. NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent execu ...

  5. 【失败的经验】在linux下编译opencv for android

    cd /home/ahfu#选择opencv 3.4.6版本来编译wget https://github.com/opencv/opencv/archive/3.4.6.tar.gztar -zxvf ...

  6. 用 eclipse ndk 编译 cocos2d-x for Android

    Android 环境搭建不详述,,可以google,,, 我用的coco2dx 是 2.14 ,2.14 用 create_project.py 脚本创建工程,Python环境配置也是很简单,这里了不 ...

  7. ndk编译时的通用Android.mk文件

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 MY_SRC_PATH := $(LOCAL_PA ...

  8. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  9. ndk 编译 boost 库,支持serialization

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...

随机推荐

  1. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

  2. C#学习笔记-组合模式

    什么是组合模式? 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 何时使用组合模式? 当需求中是体现部分与 ...

  3. 谈谈关键字new

    1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ...

  4. js面向对象学习笔记(四):对象的混合写法

    //对象的混合写法//1.构造函数function 构造函数() { this.属性}构造函数.原型.方法 = function () {};//调用var 对象1 = new 构造函数();对象1. ...

  5. 【经验分享】Hydra(爆破神器)使用方法

    这个也是backtrack下面很受欢迎的一个工具 参数详解:-R 根据上一次进度继续破解-S 使用SSL协议连接-s 指定端口-l 指定用户名-L 指定用户名字典(文件)-p 指定密码破解-P 指定密 ...

  6. 2017广东工业大学程序设竞赛C题爬楼梯

    Description 小时候,我只能一阶一阶得爬楼梯, 后来,我除了能一次爬一阶,还可以一次爬两阶, 到现在,我最多一次可以爬三阶. 那么现在问题来了,我想爬上n层楼,相邻楼层之间有一段楼梯,虽然我 ...

  7. [国嵌笔记][013][Mini2440开发板介绍]

    系统资源 处理器:三星 S3C2440A ARM9 内存:64M SDRAM Nor Flash:2MB Nand  Flash:256MB LCD:3.5寸 分辨率320*240 启动模式 从nan ...

  8. JavaScript八张思维导图—编程实践

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  9. Python3 的数据类型

    Python3 的数据类型 整形,浮点型,布尔类型 类型转换 int() 整形 采用截断的方式即向下取整,比如 a=5.5 int (a) 返回值为5 怎样才能使int()按照"四舍五入&q ...

  10. intern

    java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处.但实际 ...