本文使用: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. 【RMQ】洛谷P3379 RMQ求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. 数据结构-堆(应用篇)之堆排序法-C和C++的实现

    堆排序 关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序. 关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/78536 ...

  3. jq龙禧轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 在做vue计算属性,v-for处理数组时遇到的一个bug

    bug: You may have an infinite update loop in a component render function 无限循环 需要处理的数组(在 ** ssq **里): ...

  5. Java Socket获取本机的InetAddress实例

    package com.immooc;/* * InetAddress类 */import java.net.InetAddress;import java.net.UnknownHostExcept ...

  6. Codeforces Round #395 (Div. 2)(A.思维,B,水)

    A. Taymyr is calling you time limit per test:1 second memory limit per test:256 megabytes input:stan ...

  7. RPM包效验

  8. php(ThinkPHP)实现微信小程序的登录过程

    源码也在我的github中给出 https://github.com/wulongtao/think-wxminihelper 下面结合thinkPHP框架来实现以下微信小程序的登录流程,这些流程是结 ...

  9. ProtoBuf 与 gRPC

    用 Protobuf 很久了,但是一直觉得很简单,所以就没有做一个总结,今天想尝试一下 gRPC,顺带就一起总结一下.ProtoBuf 是个老同志了,应该是 2010 的时候发布的,然后被广泛使用,目 ...

  10. 【开发技术】Eclipse插件Call Hierarchy简介及设置

    Call Hierarchy 主要功能是 显示一个方法的调用层次(被哪些方法调,调了哪些方法) 在MyEclipse里Help - Software updates - Find and instal ...