![【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第1頁](http://file4.renrendoc.com/view/074abd6cdc7645b2c941f65ba442f37c/074abd6cdc7645b2c941f65ba442f37c1.gif)
![【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第2頁](http://file4.renrendoc.com/view/074abd6cdc7645b2c941f65ba442f37c/074abd6cdc7645b2c941f65ba442f37c2.gif)
![【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第3頁](http://file4.renrendoc.com/view/074abd6cdc7645b2c941f65ba442f37c/074abd6cdc7645b2c941f65ba442f37c3.gif)
![【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第4頁](http://file4.renrendoc.com/view/074abd6cdc7645b2c941f65ba442f37c/074abd6cdc7645b2c941f65ba442f37c4.gif)
![【移動應用開發(fā)技術(shù)】AndroidStudio中JNI工程及引用OpenCV的示例分析_第5頁](http://file4.renrendoc.com/view/074abd6cdc7645b2c941f65ba442f37c/074abd6cdc7645b2c941f65ba442f37c5.gif)
版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農(nóng)村子女撫養(yǎng)費用分擔協(xié)議
- 2025年供電企業(yè)與用戶用電合作協(xié)議
- 2025年共同策劃健身房合作合同書
- 企業(yè)勞動合同協(xié)議2025年
- 2025年企業(yè)員工勞動合同補充協(xié)議范本
- 2025年鋁合金預拉伸厚板和蒙皮鋁合金板項目立項申請報告模范
- 2025年高性能陶瓷復合材料項目立項申請報告模板
- 2025年企業(yè)變更代理協(xié)議
- 2025年漲緊輪項目提案報告模板
- 2025年血液凈化設備項目申請報告
- 中國人口研究專題報告-中國2025-2100年人口預測與政策建議-西南財經(jīng)大學x清華大學-202501
- 建筑工程安全與管理
- 幼兒園開學教師安全知識培訓
- 2024年山東水利職業(yè)學院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 遼寧省名校聯(lián)盟2025年高三1月份聯(lián)合考試 語文試卷(含答案詳解)
- 工廠廠區(qū)道路拆除實施方案
- 25版六年級寒假特色作業(yè)
- 浙江省杭州市9+1高中聯(lián)盟2025屆高三一診考試英語試卷含解析
- 2025教科版一年級科學下冊教學計劃
- 中學生勞動安全課件
- 旅游行業(yè)智慧旅游營銷策略與方案
評論
0/150
提交評論