【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第1頁
【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第2頁
【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第3頁
【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第4頁
【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析

在下給大家分享一下AndroidStudio中JNI工程及引用OpenCV的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!首先到官網(wǎng)下載OpenCV的Android包https://upload-images.jianshu.io/upload_images/14140248-ff5e89c788af5b5e.png?imageMogr2/auto-orient/stripso文件所在:

sdk

->

native

->

libs

c++的代碼

:

sdk

->

native

->

jni

->

include

->

opencv2項目結(jié)構(gòu)如下項目結(jié)構(gòu)如下https://upload-images.jianshu.io/upload_images/14140248-be66fde6ff29cf57.png?imageMogr2/auto-orient/strip結(jié)果如下,在中間顯示了一行:"HellofromC++"結(jié)果如下,在中間顯示了一行:"HellofromC++"https://upload-images.jianshu.io/upload_images/14140248-30ceda305e980866.png?imageMogr2/auto-orient/strip在靜態(tài)代碼塊中使用System.loadLibrary方法加載了native-libnative方法stringFromJNI()返回一個String并設置到了TextView上在靜態(tài)代碼塊中使用System.loadLibrary方法加載了native-libnative方法stringFromJNI()返回一個String并設置到了TextView上>[src/main/java/com/toly1994/rec/MainActivity.java]

public

class

MainActivity

extends

AppCompatActivity

{

static

{

System.loadLibrary("native-lib");

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView

tv

=

findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

}

/**

*

A

native

method

that

is

implemented

by

the

'native-lib'

native

library,

*

which

is

packaged

with

this

application.

*/

public

native

String

stringFromJNI();

}引入了jni和string頭文件,一個Java_com_toly1994_rec_MainActivity_stringFromJNI函數(shù)函數(shù)體中定義了一個sring變量,并通過env指針創(chuàng)建了一個字符串并返回引入了jni和string頭文件,一個Java_com_toly1994_rec_MainActivity_stringFromJNI函數(shù)函數(shù)體中定義了一個sring變量,并通過env指針創(chuàng)建了一個字符串并返回#include

<jni.h>

#include

<string>

extern

"C"

JNIEXPORT

jstring

JNICALL

Java_com_toly1994_rec_MainActivity_stringFromJNI(

JNIEnv

*env,

jobject

/*

this

*/)

{

std::string

hello

=

"Hello

from

C++";

return

env->NewStringUTF(hello.c_str());

}#指定

cmake

的最小版本

cmake_minimum_required(VERSION

3.4.1)

#

使用native-lib.cpp文件生成共享庫native-lib

add_library(native-lib

SHARED

native-lib.cpp

)

#

在ndk中查找log庫

取別名log-lib

find_library(log-lib

log

)

#設置

target

需要鏈接的庫

target_link_libraries(native-lib

${log-lib}

)將需要的庫以及so包拷貝到項目中,以及CMakeLists.txt的配置將需要的庫以及so包拷貝到項目中,以及CMakeLists.txt的配置https://upload-images.jianshu.io/upload_images/14140248-f52435b4168d1847.png?imageMogr2/auto-orient/strip#指定

cmake

的最小版本

cmake_minimum_required(VERSION

3.4.1)

include_directories(include)#引入文件夾

#編譯頭文件

#定義全局

my_source_path

變量

file(GLOB

my_source_path

${CMAKE_SOURCE_DIR}/*.cpp

${CMAKE_SOURCE_DIR}/*.c)

add_library(tolyCV

SHARED

${my_source_path})

#添加動態(tài)鏈接庫

add_library(lib_opencv

SHARED

IMPORTED)

set_target_properties(lib_opencv

PROPERTIES

IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java4.so)

#

在ndk中查找log庫

取別名log-lib

find_library(log-lib

log)

#

在ndk中查找jnigraphics庫

取別名jnigraphics-lib

#

jnigraphics包含圖形操作的庫

find_library(jnigraphics-lib

jnigraphics)

#設置

target

需要鏈接的庫

target_link_libraries(

tolyCV

lib_opencv

${jnigraphics-lib}

${log-lib})dlopenfailed:library"libc++_shared.so"notfound這個bug如噩夢般卡在我ndk前行的路上,以致我?guī)缀醴艞?,五天后,終得解法:dlopenfailed:library"libc++_shared.so"notfound這個bug如噩夢般卡在我ndk前行的路上,以致我?guī)缀醴艞?,五天后,終得解法:https://upload-images.jianshu.io/upload_images/14140248-384e1fb2a0ff0796.png?imageMogr2/auto-orient/strip>[app/build.gradle]

android

{

defaultConfig

{

externalNativeBuild

{

cmake

{

cppFlags

""

arguments

"-DANDROID_STL=c++_shared"http://使用c++_shared.so

}

}

}C++中無法直接操作Android的Bitmap類,所以需要轉(zhuǎn)化為像素矩陣處理,這里先寫成頭文件。關于#include<android/xxxxx>的飄紅,需要build-->RefreshLinkedC++ProjectsC++中無法直接操作Android的Bitmap類,所以需要轉(zhuǎn)化為像素矩陣處理,這里先寫成頭文件。關于#include<android/xxxxx>的飄紅,需要build-->RefreshLinkedC++Projectshttps://upload-images.jianshu.io/upload_images/14140248-9891a539302de743.png?imageMogr2/auto-orient/strip>[cpp/bitmap_utils.h]

#ifndef

REC_UTILS_H

#define

REC_UTILS_H

#include

<android/bitmap.h>

#include

<opencv2/opencv.hpp>

using

namespace

cv;//Mat

extern

"C"

{

/**

*

Bitmap

轉(zhuǎn)矩陣

*

@param

env

JNI環(huán)境

*

@param

bitmap

Bitmap對象

*

@param

mat

圖片矩陣

*

@param

needPremultiplyAlpha

是否前乘透明度

*/

void

bitmap2Mat(JNIEnv

*env,

jobject

bitmap,

Mat

*mat,

bool

needPremultiplyAlpha

=

false);

/**

*

矩陣轉(zhuǎn)Bitmap

*

@param

env

JNI環(huán)境

*

@param

mat

圖片矩陣

*

@param

bitmap

Bitmap對象

*

@param

needPremultiplyAlpha

是否前乘透明度

*/

void

mat2Bitmap(JNIEnv

*env,

Mat

mat,

jobject

bitmap,

bool

needPremultiplyAlpha

=

false);

/**

*

*

創(chuàng)建Bitmap

*

@param

env

JNI環(huán)境

*

@param

src

矩陣

*

@param

config

Bitmap配置

*

@return

Bitmap對象

*/

jobject

createBitmap(JNIEnv

*env,

Mat

src,

jobject

config);

}

#endif

//REC_UTILS_Hhttps://upload-images.jianshu.io/upload_images/14140248-b86eabf40e26ddf3.png?imageMogr2/auto-orient/stripbitmap2Mat通過bitmap獲取像素矩陣,放入mat中,這樣mat就可以在C++中操作mat2Bitmap與上面相反,通過將mat矩陣,將矩陣的像素信息置入其中createBitmap通過反射獲取Android中的createBitmap方法獲取對象,在通過mat2Bitmap置入信息。bitmap2Mat通過bitmap獲取像素矩陣,放入mat中,這樣mat就可以在C++中操作mat2Bitmap與上面相反,通過將mat矩陣,將矩陣的像素信息置入其中createBitmap通過反射獲取Android中的createBitmap方法獲取對象,在通過mat2Bitmap置入信息。#include

"bitmap_utils.h"

void

bitmap2Mat(JNIEnv

*env,

jobject

bitmap,

Mat

*mat,

bool

needPremultiplyAlpha)

{

AndroidBitmapInfo

info;

void

*pixels

=

0;

Mat

&dst

=

*mat;

//獲取信息和一些斷言

CV_Assert(AndroidBitmap_getInfo(env,

bitmap,

&info)

>=

0);//獲取Bitmap信息

CV_Assert(info.format

==

ANDROID_BITMAP_FORMAT_RGBA_8888//圖片格式RGBA_8888

或RGB_565

||

info.format

==

ANDROID_BITMAP_FORMAT_RGB_565);

CV_Assert(AndroidBitmap_lockPixels(env,

bitmap,

&pixels)

>=

0);

CV_Assert(pixels);

dst.create(info.height,

info.width,

CV_8UC4);

if

(info.format

==

ANDROID_BITMAP_FORMAT_RGBA_8888)

{

Mat

tmp(info.height,

info.width,

CV_8UC4,

pixels);

if

(needPremultiplyAlpha)

{

cvtColor(tmp,

dst,

COLOR_mRGBA2RGBA);

}

else

{

tmp.copyTo(dst);

}

}

else

{

Mat

tmp(info.height,

info.width,

CV_8UC2,

pixels);

cvtColor(tmp,

dst,

COLOR_BGR5652RGBA);

}

AndroidBitmap_unlockPixels(env,

bitmap);

}

void

mat2Bitmap(JNIEnv

*env,

Mat

mat,

jobject

bitmap,bool

needPremultiplyAlpha)

{

AndroidBitmapInfo

info;

void

*pixels

=

0;

CV_Assert(AndroidBitmap_getInfo(env,

bitmap,

&info)

>=

0);//獲取Bitmap信息

CV_Assert(info.format

==

ANDROID_BITMAP_FORMAT_RGBA_8888//圖片格式RGBA_8888

或RGB_565

||

info.format

==

ANDROID_BITMAP_FORMAT_RGB_565);

CV_Assert(mat.dims==2&&info.height==(uint32_t)mat.rows

&&

info.width==(uint32_t)mat.cols);

CV_Assert(mat.type()==CV_8UC1||mat.type()==CV_8UC3||mat.type()==CV_8UC4);

CV_Assert(AndroidBitmap_lockPixels(env,

bitmap,

&pixels)

>=

0);

CV_Assert(pixels);

if

(info.format

==

ANDROID_BITMAP_FORMAT_RGBA_8888)

{

Mat

tmp(info.height,

info.width,

CV_8UC4,

pixels);

switch

(mat.type()){

case

CV_8UC1:

cvtColor(mat,tmp,COLOR_GRAY2RGBA);

break;

case

CV_8UC3:

cvtColor(mat,tmp,COLOR_RGB2RGBA);

break;

case

CV_8UC4:

cvtColor(mat,tmp,COLOR_RGBA2mRGBA);

if

(needPremultiplyAlpha)

{

cvtColor(mat,

tmp,

COLOR_RGBA2mRGBA);

}

else

{

mat.copyTo(tmp);

}

break;

default:break;

}

}

else

{

Mat

tmp(info.height,

info.width,

CV_8UC2,

pixels);

switch

(mat.type()){

case

CV_8UC1:

cvtColor(mat,tmp,COLOR_GRAY2BGR565);

break;

case

CV_8UC3:

cvtColor(mat,tmp,COLOR_RGB2BGR565);

break;

case

CV_8UC4:

cvtColor(mat,tmp,COLOR_RGBA2BGR565);

break;

default:break;

}

}

AndroidBitmap_unlockPixels(env,

bitmap);

}

jobject

createBitmap(JNIEnv

*env,

Mat

src,

jobject

config){

jclass

java_bitmap_class=(jclass)env->FindClass("android/graphics/Bitmap");//類名

jmethodID

mid=env->GetStaticMethodID(java_bitmap_class,"createBitmap",//獲取方法

"(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");

jobject

bitmap=env->CallStaticObjectMethod(java_bitmap_class,mid,src.cols,src.rows,config);

mat2Bitmap(env,src,bitmap,

false);

return

bitmap;

}布局很簡單,就不貼了,一個iv_photo的ImageView。在點擊時調(diào)用一個opBitmap的native方法使得圖片灰度化。布局很簡單,就不貼了,一個iv_photo的ImageView。在點擊時調(diào)用一個opBitmap的native方法使得圖片灰度化。public

class

MainActivity

extends

AppCompatActivity

{

static

{

System.loadLibrary("tolyCV");

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView

iv

=

findViewById(R.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論