studio 配置 opencv3.1
环境
win10
android studio2.0
OpenCV-3.1.0-android-sdk
android-ndk-r10e-windows-x86_64
jdk-8u102-windows-x64
1配置ndk环境
2 新建JNI目录
默认生成在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的更多相关文章
- Win7系统Visual Studio 2013配置OpenCV3.1图文详解
		Win7系统Visual Studio 2013配置OpenCV3.1图文详解 OpenCV3.1对硬件加速和移动开发的支持相对于老版本都有了较大改进,支持新的开发工具,更易于扩展,配置方式也比以前简 ... 
- Win10下Android studio配置
		Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ... 
- Android studio配置Git
		Android studio配置Git 1.下载window 版git并安装:下载地址 2.Android Studio设置git插件:File->Setting->Version Con ... 
- VS2012 配置 OpenCV3.0
		VS2012 配置 opencv3.0,相比之前的版本,3.0的配置简单了好多. 通过配置属性文件,可以做到一次配置,重复使用! 根据文章的操作在 win7 64bit VS2012 下成功配置 op ... 
- win10下vs2015配置Opencv3.1.0过程详解
		下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载. 点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为 ... 
- Android Studio配置Git及Git文件状态说明
		Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ... 
- openGL学习:Visual Studio配置OpenGL
		Visual Studio配置OpenGL 分两步: (一)下载glut,并将其放置到适当的位置 (二) 进行vs2005项目属性配置 ******************************** ... 
- 使用zend studio配置Xdebug调试PHP教程
		这里看过上面的文章后写一下自己的想法. 最近安装了zend studio 10.5,下载了破解文件.开始是下载了10.0的版本,但是注册码不正确.所以只能安装最新的10.5了. 接下来进行PHP代码调 ... 
- Android Studio 配置SVN实现代码管理
		Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ... 
随机推荐
- 【BZOJ4668】冷战 并查集
			[BZOJ4668]冷战 Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺 ... 
- Building REST services with Spring
			https://spring.io/guides/tutorials/bookmarks/ 
- 一文读懂P2P和区块链的异同
			说到P2P,大家的第一反应肯定是网络贷款.非法集资...事实上,P2P不等于网络贷款,他是点对点,人对人的交易模式. 而对于近两年最热的区块链技术,他和P2P有什么区别呢?区块链数据交换模式包括私有链 ... 
- HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
			题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2264 思路 从终点往起点走 然后每次更新状态 因为要满足 最短路线 所以其实 只能是 往左走,往下走 或 ... 
- 常用git命令和工具
			0. ln -s src_dir //一个参数即可在当前目录下生成一个软链接 1.git command --clone/push a branch git clone <url ... 
- Windows程序设计(1)——Win32运行原理(二)
			创建进程 1 进程和线程 2 应用程序的启动过程 3 CreateProcess函数 4 实例 3 创建进程 3.1 进程和线程 进程通常被定义为一个存在运行的程序的实例.进程是一个正在运行的程序,它 ... 
- ubuntu安装ros indigo
			版本是14.04.1 一.先配置 1.点击新立得软件包管理器,输入密码exbot123, 2,点击最上面一栏的设置,选择软件源,前四个打勾,后一个不打,把sevice america改成mainsev ... 
- oracle添加表注释和表字段注释
			创建Oracle数据库表时加上注释 CREATE TABLE t1( id varchar2(32) primary key,name VARCHAR2(8) NOT NULL, age numbe ... 
- HTML: 简单的悬停效果
			1. [图片] 捕获.jpg 2. [代码][CSS]代码 body { background: #000; overflow-y: scroll; } .items { ... 
- 机器学习: 特征脸算法 EigenFaces
			人脸识别是机器学习和机器视觉领域非常重要的一个研究方向,而特征脸算法是人脸识别里非常经典的一个算法,EigenFaces 是基于PCA (principal component analysis) 即 ... 
