android studio opencv c++,Android studio 中基于c++的OpenCV 配置

Android studio 中基于c++的OpenCV 配置

最近在做文字识别的App,需要调用图像处理的c++代码,关于OpenCV的配置遇到很多坑,因此记录一下配置流程。

配置版本:Android studio:3.6.3(版本查看:Help–>About)

Opencv :4.1.2(Android版),下载后解压即可

若opencv版本不同也可以,但需要注意后续中配置进行相应更改。

1.新建Native C++工程

File–>New–>New Project,选择Native C++;

15c221f43bc2e64b752e980b6fc42c9c.png

2.导入opencv

选择File --> New -->Import Module,导入刚刚解压的opencv-4.1.2-android-sdk,选择OpenCV-android-sdk\sdk\java.

94452f287e52ad6429120d74c1392f68.png

3.修改build.gradle (opencv)

将文件中的 ‘application’ 改为‘library’ ,将defaultConfig中的“applicationId” org.opencv ”一行 删除;(如果是opencv3就不需要更改,自动生成library)

87e2f25f41b5c8cdc739cab17615a789.png

4.build.gradle (: app) 和build.gradle (: opencv)修改

两个文件中的 compileSdkVersion和build ToolsVersion 需要保持一致

f6734cbbc5c900503b976e4db564f105.png

5.将opencv作为dependencies加到app中

选择File --> Project Structure --> Dependencies,选择app后点+号,选择opencv

67299749293016c49a531a09d6f6bd08.png

6.在src/main/下新建JNI Folder

文件名为jniLibs,并将D:\soft\opencv-4.1.2-android-sdk\OpenCV-android-sdk\sdk \ native \ libs下的四个文件复制过去(opencv3版本也是复制下图的四个文件)

7e8349e6bef34f3ab8e7de594292df41.png

结果如下图所示

4bcc7262844af70b5e9cf3e30a9ec590.png

7.修改gradle.properties文件

加入opencv的路径

opencvsdk=D\:/soft/opencv-4.2.1-android-sdk/OpenCV-android-sdk

a0bf4104ffd91aa48c4cfd8f1b4085d8.png

8.修改 Settings.gradle文件

添加如下内容,project中的内容为导入opencv时的命名。

include ':opencv4'

project(':opencv4').projectDir = new File(opencvsdk + '/sdk')

9.修改Build.gradle(:app)文件

在externalNativeBuild中添加如下内容:

externalNativeBuild {

cmake {

cppFlags "-frtti -fexceptions"

abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'

arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native"

}

}

结果如下图

4de44338720a6f6d0a6ac32e89215880.png

修改sourceSets部分如下:

d345ce05fa256b2e45eec37cbcddadd5.png

10. 修改CMakeList.txt文件

在add_library上面添加如下内容:

opencv4版本

include_directories(${OpenCV_DIR}/jni/include)

add_library( lib_opencv SHARED IMPORTED )

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so)

opencv3版本

include_directories(${OpenCV_DIR}/jni/include)

add_library( lib_opencv SHARED IMPORTED )

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so)

在target_link_libraries加入lib_opencv

d049162361e116a0fc875a2b5f4a39d9.png

11.测试代码

Native-lib.cpp

#include

#include

#include

extern "C"

JNIEXPORT jstring JNICALL

Java_com_example_test_MainActivity_opencvTest(JNIEnv *env, jobject thiz, jlong mad_addr_gr,jlong mat_addr_rgba) {

cv::Rect();

cv::Mat();

std::string hello2="hello from opencvtest";

return env->NewStringUTF(hello2.c_str());

// TODO: implement validate()

}

extern "C"

JNIEXPORT jstring JNICALL

Java_com_example_test_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {

// TODO: implement stringFromJNI()

std::string hello = "Hello from C++";

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

}

12.MainActiviy.java代码

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import org.opencv.android.OpenCVLoader;

public class MainActivity extends AppCompatActivity {

private static String TAG="MainActivity";

static {

System.loadLibrary("native-lib");

System.loadLibrary("opencv_java4");//opencv4版本

//System.loadLibrary("opencv_java3");opencv3版本

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView textView=(TextView) findViewById(R.id.sample_text);

textView.setText(stringFromJNI());

// Example of a call to a native method

TextView tv = findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

if (OpenCVLoader.initDebug()) {

textView.setText(textView.getText()+"\n OPENCV LOADED SUCCESSFULLY");

textView.setText(textView.getText()+"\n"+validate(500,500));

} else {

Log.d(TAG, "OPENCV DİD NOT LOAD");

}

}

public native String stringFromJNI();

public native String opencvTest(long madAddrGr,long matAddrRgba);

}

测试结果如下:

ff8fd17f17cfc2257492064f901644d6.png

ps:opencv3版需要用NDK16,具体原因暂时不知。

若有错误请指正。

本文地址:https://blog.csdn.net/qq_42881467/article/details/107567570

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值