环境

win10

android studio2.0

OpenCV-3.1.0-android-sdk

android-ndk-r10e-windows-x86_64

jdk-8u102-windows-x64

1配置ndk环境

补充,这里注意把ndk的环境变量补上,目录设置为ndk的根目录就ok,主要是用来使用ndk-build

2 新建JNI目录

先单选工程目录,然后再点File,否则没那么多选项,找不到创建目录选项

默认生成在app/src/main/jni/

3 在jni中加入Application.mk和Android.mk

Application.mk

APP_STL := gnustl_static                                       //标准c++ stl库
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a //还可以添加x86等
APP_PLATFORM := android-23 //可以不写

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off OPENCV_LIB_TYPE :=STATIC//使用静态库 ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include D:\soft\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk//这个路径配自己的
else
include $(OPENCV_MK_PATH)
endif LOCAL_MODULE := OpenCV //打包so的名称,实际名称是libOpenCV.so 加载时只需要加载OpenCV.so LOCAL_SRC_FILES := com_n_topencv_OpencvUtils.cpp//要放进so的cpp LOCAL_LDLIBS += -lm -llog include $(BUILD_SHARED_LIBRARY)

说明:


如果有多个放入so的cpp

可以按如下写法

LOCAL_SRC_FILES := \
playercore-jni.cpp \
libplayer.cpp \
event.cpp \
lock.cpp \
receiver.cpp \
decoder.cpp \
render.cpp \
androidaudio.cpp \
androidvideo.cpp \
blit.cpp \
yuv2rgbv7.S

4 工程配置

app下的build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3" defaultConfig {
applicationId "com.n.topencv"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0" //ndk{
// moduleName "OpenCV" //生成的so名字
// abiFilters "armeabi", "armeabi-v7a" //输出指定三种abi体系结构下的so库。目前可有可无。
//} }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs'] //把jni库指定为中括号中地址(原地址src/main/jniLibs)默认ndk-build生成so位置为libs
jni.srcDirs = [] //这个如果不设置,.h文件会提示找不到jni.h(这个文件在java sdk的include中)
} }
} dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
}

gradle.properties (补充,之后下载的gradle没这个文件,在gradle/wrapper/下只有gradle-wrapper.properties)

添加一句,这句是使用旧版ndk,否则使用的是实验版构建方式(实验版- -!你懂的)

android.useDeprecatedNdk=true

local.properties

sdk.dir=D\:\\soft\\Android\\sdk
ndk.dir=D\:\\soft\\android-ndk-r10e

5 添加java代码

MainActivity

package com.n.topencv;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.media.Image;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.ImageView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Log.e("nafio","OnCreate");
OpencvUtils opencv = new OpencvUtils();
Log.e("nafio","InitSo"); ImageView img = new ImageView(this);
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
R.mipmap.ic_launcher)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
Log.e("nafio","befor opencv!");
int [] resultPixes=opencv.gray(pix,w,h);
Log.e("nafio","after opencv!");
Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565);
result.setPixels(resultPixes, 0, w, 0, 0,w, h); //ImageView img = (ImageView) findViewById(R.id.myImageView);
if(null!=img)img.setImageBitmap(result);
else{
Log.e("nafio","null fuck!");
}
setContentView(img); } }
OpencvUtils
package com.n.topencv;

/**
* Created by cuizheng on 2016/8/1.
*/
public class OpencvUtils {
static {
System.loadLibrary("OpenCV"); //defaultConfig.ndk.moduleName
} public native int[] gray(int[] pix,int w,int h);
}

xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.n.topencv"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

6 添加jni c++代码

com_n_topencv_OpencvUtils.h

这个文件可以自动生成

写完OpencvUtils.java(里面包含有native方法)这个类后,build一下工程,会在

下生成OpencvUtils.class

Terminal进入这个debug文件夹 执行javah -jni com.n.topencv.OpencvUtils

执行成功会在debug下生成com_n_topencv_OpencvUtils.h,把这个头文件copy到jni中

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_n_topencv_OpencvUtils */ #ifndef _Included_com_n_topencv_OpencvUtils
#define _Included_com_n_topencv_OpencvUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_n_topencv_OpencvUtils
* Method: gray
* Signature: ([III)[I
*/
JNIEXPORT jintArray JNICALL Java_com_n_topencv_OpencvUtils_gray
(JNIEnv *, jobject, jintArray, jint, jint); #ifdef __cplusplus
}
#endif
#endif

com_n_topencv_OpencvUtils.cpp

//
// Created by cuizheng on 2016/8/1.
// #include "com_n_topencv_OpencvUtils.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp> using namespace cv; extern "C" { JNIEXPORT jintArray JNICALL Java_com_n_topencv_OpencvUtils_gray(
JNIEnv *env, jobject obj, jintArray buf, int w, int h); JNIEXPORT jintArray JNICALL Java_com_n_topencv_OpencvUtils_gray(
JNIEnv *env, jobject obj, jintArray buf, int w, int h) { jint *cbuf;
cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
if (cbuf == NULL) {
return 0;
} Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf); uchar* ptr = imgData.ptr(0);
for(int i = 0; i < w*h; i ++){
//计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
//对于一个int四字节,其彩色值存储方式为:BGRA
int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
ptr[4*i+1] = grayScale;
ptr[4*i+2] = grayScale;
ptr[4*i+0] = grayScale;
} int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
}

问题说明,这两个文件打开android studio会一直提示,就算点了Sync Now也没用,还是这个提示,不用管,不影响打包和运行

7 用ndk-build打包so

Terminal进入jni文件夹

执行ndk-build,如果执行成功会生成如下文件夹

说明:一旦so包打出来了,jni文件夹就可有可无了,都不影响程序运行

8 运行

一些常见错误报错说明

Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

需要在gradle.properties中添加android.useDeprecateNdk = true;使用旧版的ndk功能(不添加会使用实验性的ndk构建工具)

android studio上写c++头文件,引入jni.h时发现报红,cannot find jni.h

解决方法在app->build.gradle中,android标签中

sourceSets {
main() {
jni.srcDirs = [];
} }

Error: Your project contains C++ files but it is not using a supported native build system

这个问题解决方法跟上面类似

gradle.properties中加

Android.useDeprecatedNdk=true



build.gradle(Module:app)中加

sourceSets {

  main {

        jni.srcDirs = []

  }

}

studio 配置 opencv3.1的更多相关文章

  1. Win7系统Visual Studio 2013配置OpenCV3.1图文详解

    Win7系统Visual Studio 2013配置OpenCV3.1图文详解 OpenCV3.1对硬件加速和移动开发的支持相对于老版本都有了较大改进,支持新的开发工具,更易于扩展,配置方式也比以前简 ...

  2. Win10下Android studio配置

    Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ...

  3. Android studio配置Git

    Android studio配置Git 1.下载window 版git并安装:下载地址 2.Android Studio设置git插件:File->Setting->Version Con ...

  4. VS2012 配置 OpenCV3.0

    VS2012 配置 opencv3.0,相比之前的版本,3.0的配置简单了好多. 通过配置属性文件,可以做到一次配置,重复使用! 根据文章的操作在 win7 64bit VS2012 下成功配置 op ...

  5. win10下vs2015配置Opencv3.1.0过程详解

    下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载.  点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为 ...

  6. Android Studio配置Git及Git文件状态说明

    Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ...

  7. openGL学习:Visual Studio配置OpenGL

    Visual Studio配置OpenGL 分两步: (一)下载glut,并将其放置到适当的位置 (二) 进行vs2005项目属性配置 ******************************** ...

  8. 使用zend studio配置Xdebug调试PHP教程

    这里看过上面的文章后写一下自己的想法. 最近安装了zend studio 10.5,下载了破解文件.开始是下载了10.0的版本,但是注册码不正确.所以只能安装最新的10.5了. 接下来进行PHP代码调 ...

  9. Android Studio 配置SVN实现代码管理

    Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ...

随机推荐

  1. 【BZOJ4668】冷战 并查集

    [BZOJ4668]冷战 Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺 ...

  2. Building REST services with Spring

    https://spring.io/guides/tutorials/bookmarks/

  3. 一文读懂P2P和区块链的异同

    说到P2P,大家的第一反应肯定是网络贷款.非法集资...事实上,P2P不等于网络贷款,他是点对点,人对人的交易模式. 而对于近两年最热的区块链技术,他和P2P有什么区别呢?区块链数据交换模式包括私有链 ...

  4. HZNU 与班尼特·胡迪一起攻破浮空城 【DP】

    题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2264 思路 从终点往起点走 然后每次更新状态 因为要满足 最短路线 所以其实 只能是 往左走,往下走 或 ...

  5. 常用git命令和工具

    0. ln -s src_dir  //一个参数即可在当前目录下生成一个软链接   1.git command --clone/push a branch      git clone <url ...

  6. Windows程序设计(1)——Win32运行原理(二)

    创建进程 1 进程和线程 2 应用程序的启动过程 3 CreateProcess函数 4 实例 3 创建进程 3.1 进程和线程 进程通常被定义为一个存在运行的程序的实例.进程是一个正在运行的程序,它 ...

  7. ubuntu安装ros indigo

    版本是14.04.1 一.先配置 1.点击新立得软件包管理器,输入密码exbot123, 2,点击最上面一栏的设置,选择软件源,前四个打勾,后一个不打,把sevice america改成mainsev ...

  8. oracle添加表注释和表字段注释

    创建Oracle数据库表时加上注释 CREATE TABLE t1( id  varchar2(32) primary key,name VARCHAR2(8) NOT NULL, age numbe ...

  9. HTML: 简单的悬停效果

    1. [图片] 捕获.jpg ​2. [代码][CSS]代码     body {    background: #000;    overflow-y: scroll;  }  .items {  ...

  10. 机器学习: 特征脸算法 EigenFaces

    人脸识别是机器学习和机器视觉领域非常重要的一个研究方向,而特征脸算法是人脸识别里非常经典的一个算法,EigenFaces 是基于PCA (principal component analysis) 即 ...