OpenCV (Open Source Computer Vision Library)

https://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#native-c

1,下载opencv for android 的sdk

https://opencv.org/releases.html

打开 sdk/native/jni,如无意外,里面肯定有个 文件叫做 OpenCV.mk,它就是我们在 android.mk 脚本文件中要引入 opencv C++库所要参照的文件。

2,写mk

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_INSTALL_MODULES := on #Copies necessary OpenCV dynamic libs to the project libs folder

OPENCV_CAMERA_MODULES := off #Skip native OpenCV camera related libs copying to the project libs folder.

OPENCV_LIB_TYPE:=STATIC

include E:\work\starRTC\opencv\jni\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk

LOCAL_MODULE := starRTC

LOCAL_SRC_FILES := main.cpp

LOCAL_LDLIBS += -llog -lz -lm

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_OPTIM:=debug

APP_ABI := armeabi-v7a

APP_PLATFORM=android-18

APP_STL := gnustl_static

#APP_CPPFLAGS := -std=c++11

APP_CPPFLAGS := -frtti -fexceptions

3,写jni代码

main.h

#ifndef _android_starLiveVideo_

#define _android_starLiveVideo_

#include <jni.h>

#include <opencv2/opencv.hpp>

#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

IplImage * change4channelTo3InIplImage(IplImage * src);

#endif

main.cpp

#include <main.h>

#include <stdio.h>

#include <stdlib.h>

using namespace cv;

JNIEXPORT jintArray JNICALL interface_test(JNIEnv* env, jobject obj,

jintArray buf, int w, int h) {

jint *cbuf;

cbuf = env->GetIntArrayElements(buf, false);

if (cbuf == NULL) {

return 0;

}

Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);

IplImage image=IplImage(myimg);

IplImage* image3channel = change4channelTo3InIplImage(&image);

IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);

cvCanny(image3channel,pCannyImage,50,150,3);

int* outImage=new int[w*h];

for(int i=0;i<w*h;i++)

{

outImage[i]=(int)pCannyImage->imageData[i];

}

int size = w * h;

jintArray result = env->NewIntArray(size);

env->SetIntArrayRegion(result, 0, size, outImage);

env->ReleaseIntArrayElements(buf, cbuf, 0);

return result;

}

IplImage * change4channelTo3InIplImage(IplImage * src) {

if (src->nChannels != 4) {

return NULL;

}

IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);

for (int row = 0; row < src->height; row++) {

for (int col = 0; col < src->width; col++) {

CvScalar s = cvGet2D(src, row, col);

cvSet2D(destImg, row, col, s);

}

}

return destImg;

}

static JNINativeMethod gMethodsSrc[] = {

{"interface_test", "([III)[I", (void*)interface_test}

};

int register_native_mothods(JNIEnv *env, const char *class_name, JNINativeMethod *gMethods, int numMethods){

jclass clazz;

clazz = env->FindClass(class_name);

if(clazz == NULL){

//loge("err:FindClass failed,className=%s\n",class_name);

return 0;

}

if(env->RegisterNatives(clazz, gMethods, numMethods) < 0){

//loge("err:RegisterNatives failed, numMethods=%d\n", numMethods);

return 0;

}

return 1;

}

JNIEXPORT

jint JNI_OnLoad(JavaVM *jvm, void *reserved){

JNIEnv *env = NULL;

jint result = JNI_ERR;

int i;

if(jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK){

//loge("err:GetEnv failed");

return result;

}

register_native_mothods(env, "com/starrtc/starrtcsdk/socket/StarSocket", gMethodsSrc, NELEM(gMethodsSrc));

return JNI_VERSION_1_4;

}

4,ndk-build

android ndk opencv jni 编译集成的更多相关文章

  1. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  2. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  3. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  4. Android NDK之JNI陷阱

    背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...

  5. 在eclipse中配置android ndk的自动编译环境builders

    无论linux还是mac在jni目录中直接运行  ndk-build 就可以生成 lib目录及所需要的 so文件: windows 装上lnx模拟器也是一样: 每次修改完 c++代码, 都要运行一下 ...

  6. ADT+NDK搭建jni编译环境

    jni是android调用C++编写的库的接口.C++和java的差别不在此文的讨论范畴,另外这里也仅仅是记录下.怎样搭建好开发环境. 首先是下载ADT包和NDK包. ADT包包括了eclipse.所 ...

  7. Android NDK开发----- JNI多线程

    一.概述 JNI编程和Linux上的C/C++编程还是挺相似的,每次java调用JNI中的函数时都会传入有关JVM的一些参数(如JNIEnv,jobject),每次JNI回调java中的方法时都要通过 ...

  8. Android NDK工程的编译和链接以及使用gdb进行调试

    前提条件:已经安装了JDK 6.0.android SDK.NDK r9和eclipsele4.2开发环境. 推荐下载Android开发的综合套件adt-bundle-windows-x86,再下载A ...

  9. Android NDK引用预编译的动态链接库

    NDK里有个例子: android-ndk-r10/samples/module-exports/jni一看就懂了 ———————————————————————————– 从r5版本开始,就支持预编 ...

随机推荐

  1. SPFA 上手题 数 枚:

    1, HDU 1548 A strange lift :http://acm.hdu.edu.cn/showproblem.php?pid=1548 这道题可以灰常巧妙的转换为一道最短路题目,对第i层 ...

  2. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  3. python学习笔记011——内置函数dir()

    1 描述 dir()函数可以查看(打印)对象的属性和方法.不管时那种对象(python中一切皆对象)类型(数据,模块)都有自己的属性和方法. dir() 函数不带参数时,返回当前范围内的变量.方法和定 ...

  4. 转 生成 HTMLTestRunner 测试报告

    转自:http://www.cnblogs.com/hero-blog/p/4128575.html 04.生成 HTMLTestRunner  测试报告   1.HTMLTestRunner 是 P ...

  5. Python len() 方法

    描述 Python len() 方法返回对象(字符串.列表.元组.字典等)长度或项目个数. 语法 len() 方法语法: len(obj) 参数 obj -- 对象(字符串.列表.元组.字典等). 返 ...

  6. hdu 4961 Boring Sum(高效)

    pid=4961" target="_blank" style="">题目链接:hdu 4961 Boring Sum 题目大意:给定ai数组; ...

  7. News summary on C# and .NET

    (keep updating...) Roslyn http://blogs.msdn.com/b/ericlippert/archive/2012/06/05/announcing-microsof ...

  8. paip.分布式应用系统java c#.net php的建设方案

    paip.分布式应用系统java c#.net php的建设方案 1. 基础设施的建立 1 2. 本地的的调用API 1 3. 数据的传输 1 4. 代码的传输 1 5. 代码的自动热编译 2 6.  ...

  9. 20.5 语音合成(百度2016年2月29日发布的tts引擎)

    分类:C#.Android.VS2015: 创建日期:2016-03-17 一.简介 编写手机App时,有时需要使用文字转语音(Text to Speech)的功能,比如开车时阅读收到的短信.导航语音 ...

  10. onethink迁移

    修改applicattion下面的Common跟User里面的config.php文件两个