我目前正在处理一个使用OpenCV3进行实时视频处理的项目(应用一组颜色过滤器),并且成功地将其与Java配合使用。
接下来我想要做的是通过NDK将所有Java逻辑实现到C++中(以提高性能)。这样我就不需要在MAT对象和字节缓冲区之间进行转换,从而节省了一些循环。但是我真的卡在了尝试使用gradle链接.so、.a静态库和头文件以在我的.CPP文件中使用。
这是我正在使用的gradle文件:
apply plugin: 'com.android.model.application'
def opencvandroid_sdk_path = file(project(':opencvandroid').projectDir).absolutePath + "/src/main"
model {
repositories {
libs(PrebuiltLibraries) {
opencv {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_calib3d.a")
}
}
opencv1 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_core.a")
}
}
opencv2 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_features2d.a")
}
}
opencv3 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_flann.a")
}
}
opencv4 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_highgui.a")
}
}
opencv5 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgcodecs.a")
}
}
opencv6 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgproc.a")
}
}
opencv7 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_ml.a")
}
}
opencv8 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_objdetect.a")
}
}
opencv9 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_photo.a")
}
}
opencv10 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_shape.a")
}
}
opencv11 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_stitching.a")
}
}
opencv12 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_superres.a")
}
}
opencv13 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_video.a")
}
}
opencv14 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videoio.a")
}
}
opencv15 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videostab.a")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.example"
minSdkVersion.apiLevel = 16
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
/*
* native build settings
*/
android.ndk {
moduleName = "hello-jni"
/*
* Other ndk flags configurable here are
* cppFlags += "-fno-rtti"
* cppFlags += "-fno-exceptions"
* ldLibs = ["android", "log"]
* stl = "system"
*/
platformVersion = 16 //same as minSdkVersion.apiLevel for better compatibility
/*def jniPath = opencvandroid_sdk_path + "jniLibs"
cppFlags += "-I${file(jniPath)}".toString()
file(jniPath).eachDirRecurse { dir ->
cppFlags += "-I${file(dir)}".toString()
}*/
stl = "c++_static"
ldLibs.addAll(["atomic", "log", "android"])
}
android.sources {
main {
jni {
dependencies {
library "opencv1" linkage "static"
library "opencv2" linkage "static"
library "opencv3" linkage "static"
library "opencv4" linkage "static"
library "opencv5" linkage "static"
library "opencv6" linkage "static"
library "opencv7" linkage "static"
library "opencv8" linkage "static"
library "opencv9" linkage "static"
library "opencv10" linkage "static"
library "opencv11" linkage "static"
library "opencv12" linkage "static"
library "opencv13" linkage "static"
library "opencv14" linkage "static"
library "opencv15" linkage "static"
}
}
}
}
android.buildTypes {
release {
minifyEnabled = false
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile project(':opencvandroid')
}
我正在基于这个在github上找到的示例文件编写我的gradle文件。 现在,我发现一个问题是,OPENCV有一些静态库文件,因此根据此帖子所说,我必须在gradle中将每个库添加到不同的lib中以进行链接,因此导致我的gradle文件充斥着重复的库定义。
当我尝试在我的.cpp代码中包含头文件时,Android Studio找不到它们(甚至无法找到用于使用的名称空间)。这是我的CPP代码:
#include <jni.h>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include <vector>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);
JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{
Mat& mGr = *(Mat*)addrGray;
Mat& mRgb = *(Mat*)addrRgba;
vector<KeyPoint> v;
Ptr<FeatureDetector> detector = FastFeatureDetector::create(50);
detector->detect(mGr, v);
for( unsigned int i = 0; i < v.size(); i++ )
{
const KeyPoint& kp = v[i];
circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));
}
}
}
我有点不确定是否还有什么遗漏,导致他们无法正确链接?
def jniPath
的部分? - Alex CohncppFlags.addAll(['-std=c++11', '-fexceptions', '-frtti', '-Wno-error=format-security'])
。然而,在我的静态库中仍然出现了未定义的引用错误。 - IgorGanapolsky