Android Studio 導(dǎo)入OpenCV及Eigen及JNI使用

操作系統(tǒng):MAC OS X 10.11.5
Android Studio 版本:2.1.2
OpenCV for Android 版本:2.4.9
Android NDK 版本:r11c

其實(shí)呢,這個(gè)過(guò)程不是很復(fù)雜搔体,大概需要做以下那么幾件事情

  • 下載并配置好OpenCV for Android 睁本、Eigen和NDK
  • 寫(xiě)好cpp程序,Android.mk隙咸,Application.mk以及Java程序
  • 對(duì)cpp程序用ndk-build編譯成動(dòng)態(tài)庫(kù)或者在運(yùn)行的時(shí)候進(jìn)行編譯怖亭,然后運(yùn)行Java程序的時(shí)候調(diào)用動(dòng)態(tài)庫(kù)

接下來(lái)我們一個(gè)一個(gè)的來(lái)過(guò)一下及穗,看看具體應(yīng)該怎么做

下載及配置

  • NDK
    下載地址:NDK

    1. 在Android Studio 中添加NDK,F(xiàn)ile -> Project Structure -> SDK Location 最下面一欄添加ndk的路徑
    2. 在app/src/main下面添加文件夾jni哄褒,主要用于存放C++文件及其頭文件
      然后需要在gradle.properties里面加一行android.useDeprecatedNdk=true
  • OpenCV for Android
    下載地址:OpenCV for Android

    1. 下載完成之后稀蟋,Android Studio -> File -> import mudules,選擇OpenCV文件夾下的sdk/java
    2. 新導(dǎo)入的openCVLibrary249(300表示3.0.0,其它版本類(lèi)推)呐赡,下面有個(gè)build.gradle文件退客,將里面的compileSdkVersion、buildToolsVersion链嘀、minSdkVersion萌狂、targetSdkVersion修改,使其與app目錄下的build.gradle保持一致管闷。
  • Eigen
    下載地址:Eigen
    下載解壓之后粥脚,直接將里面Eigen文件夾整個(gè)拷貝到j(luò)ni下

程序的編寫(xiě)

  • cpp程序
    我只想簡(jiǎn)單試試能不能調(diào)用opencv以及eigen,所以cpp程序很簡(jiǎn)單包个,只是把Eigen及opencv.hpp調(diào)用一下刷允,沒(méi)報(bào)錯(cuò)的話(huà)應(yīng)該就沒(méi)問(wèn)題冤留,之后再寫(xiě)個(gè)小程序
    注意這里面的函數(shù)名字結(jié)構(gòu)是Java_包名Activity名函數(shù)名,這個(gè)你需要修改成你的
#include <iostream>
#include <Eigen/Dense>
#include <math.h>
#include <jni.h>
#include <opencv2/opencv.hpp>
extern "C"{    
    JNIEXPORT int JNICALL Java_com_example_gaoxiangzhang_datacollection_MainActivity_test    (JNIEnv *env, jobject obj, int x)    
    {                
        return x;    
    }
}

Android.mk以及Application.mk的使用方法大家可以看看這里

  • Android.mk

This page describes the syntax of the Android.mk build file, which glues your C and C++ source files to the Android NDK.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")

include /path-to-opencv/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif

LOCAL_MODULE    := test
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
  • Application.mk

This document explains the Application.mk build file, which describes the native modules that your app requires. A module can be a static library, a shared library, or an executable.

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
  • Java 程序
    在Java程序中定義一個(gè)接口树灶,并且載入生成的動(dòng)態(tài)庫(kù)纤怒,然后在程序中調(diào)用這個(gè)接口就可以了
public static native int test(int x);
static {    
    System.loadLibrary("test");
}

編譯cpp程序

有兩個(gè)方法,一個(gè)是在build.gradle寫(xiě)好怎么編譯天通,一個(gè)是先編譯好泊窘,我選擇的是先編譯好。
在終端下首先cd到j(luò)ni目錄像寒,然后運(yùn)行ndk中的ndk-build程序即可

path-to-project/app/src/main/jni $ path-to-ndk/android-ndk-r11c/ndk-build

編譯好后呢烘豹,你會(huì)發(fā)現(xiàn)app/src/main下面多了一個(gè)libs的文件夾,里面就有我們需要的動(dòng)態(tài)庫(kù)诺祸,我們就可以調(diào)用啦
還有最后一步要做的就是在app的build.gradle加上

sourceSets.main{    
    jniLibs.srcDir 'src/main/libs' //set .so files directory to libs    
    jni.srcDirs = [] //disable automatic ndk-build call
}

防止你們加錯(cuò)携悯,在加點(diǎn)代碼…

android {    
    compileSdkVersion 23    
    buildToolsVersion '23.0.3'    
    defaultConfig {        
        applicationId "com.example.gaoxiangzhang.datacollection"        
        minSdkVersion 21        
        targetSdkVersion 23        
        versionCode 1        
        versionName "1.0"        
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    
    }    
    buildTypes {        
        release {            
            minifyEnabled false            
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        
        }    
    }    
    sourceSets.main{    
        jniLibs.srcDir 'src/main/libs' //set .so files directory to libs    
        jni.srcDirs = [] //disable automatic ndk-build call
    }
}

告訴程序動(dòng)態(tài)庫(kù)在哪里以及不需要調(diào)用ndk-build再編譯了,因?yàn)槲覀円呀?jīng)編譯過(guò)了

main文件夾里面的目錄是這個(gè)樣子的


目錄樹(shù)

當(dāng)然這中間可能會(huì)遇到一些問(wèn)題筷笨,你可以選擇google或者提問(wèn)憔鬼,我之前忘了記錄了,不過(guò)其實(shí)錯(cuò)誤提醒都比較明顯胃夏,大家遇到錯(cuò)誤不要只想著直接搜索答案轴或,無(wú)腦解決…應(yīng)該自己先分析一下,嗯嗯其實(shí)我是在說(shuō)我自己仰禀。

參考鏈接:Android Studio 配置OpenCV照雁、NDK,并用Jni調(diào)用OpenCV

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悼瘾,一起剝皮案震驚了整個(gè)濱河市囊榜,隨后出現(xiàn)的幾起案子审胸,更是在濱河造成了極大的恐慌亥宿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砂沛,死亡現(xiàn)場(chǎng)離奇詭異烫扼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碍庵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)映企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人静浴,你說(shuō)我怎么就攤上這事堰氓。” “怎么了苹享?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵双絮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)囤攀,這世上最難降的妖魔是什么软免? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮焚挠,結(jié)果婚禮上膏萧,老公的妹妹穿的比我還像新娘。我一直安慰自己蝌衔,他們只是感情好榛泛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著噩斟,像睡著了一般挟鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亩冬,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天艘希,我揣著相機(jī)與錄音,去河邊找鬼硅急。 笑死覆享,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的营袜。 我是一名探鬼主播撒顿,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荚板!你這毒婦竟也來(lái)了凤壁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跪另,失蹤者是張志新(化名)和其女友劉穎拧抖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體免绿,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唧席,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘲驾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淌哟。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辽故,靈堂內(nèi)的尸體忽然破棺而出徒仓,到底是詐尸還是另有隱情,我是刑警寧澤誊垢,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布掉弛,位于F島的核電站喻杈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狰晚。R本人自食惡果不足惜筒饰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壁晒。 院中可真熱鬧瓷们,春花似錦、人聲如沸秒咐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)携取。三九已至攒钳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雷滋,已是汗流浹背不撑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晤斩,地道東北人焕檬。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像澳泵,于是被迫代替她去往敵國(guó)和親实愚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容