MAC-Adroidstudio中使用OpenCV

本文详细介绍了如何在Mac上的Android Studio环境中配置并使用OpenCV库,包括设置NDK路径、编辑Gradle配置文件、创建JNI目录及源文件、构建so库文件等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在MAC-Adroidstudio中使用OpenCV

首先,要检查JDK和NDK等有没有安装好,没有安装好的话赶快去官网上下吧~~,欧对了,,我的AS貌似是1.5版本的。准备工作做好之后就可以开始辣~

把OpenCV中的native文件放到新建工程的最低层文件夹中,就像这样哈

然后新建Jni目录,也是像这样哈~

在Jni中新建两个文件夹,就像这样~

编辑gradle.properties文件,增加下面的属性使用旧版的ndk功能(不添加会使用实验性的ndk构建工具

android.useDeprecatedNdk=true

在local.properties文件中配置ndk目录

ndk.dir=ndk.dir=/Users/orekinana/Downloads/Android/android-ndk-r11b

编辑build.gradle,在android节点中增加下面的代码

sourceSets.main.jni.srcDirs = []
    //禁止自带的ndk功能
    sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs']
    //重定向so目录为src/main/libs和src/main/jniLibs,原来为src/main/jniLibs

    task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
        def ndkDir = properties.getProperty('ndk.dir')

        if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
            commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath
        } else {
            commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }

    task ndkClean(type: Exec, description: 'Clean NDK Binaries') {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
        def ndkDir = properties.getProperty('ndk.dir')

        if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
            commandLine "$ndkDir/ndk-build.cmd",'clean', '-C', file('src/main/jni').absolutePath
        } else {
            commandLine "$ndkDir/ndk-build",'clean', '-C', file('src/main/jni').absolutePath
        }
    }

    clean.dependsOn 'ndkClean'

在之前新建的Application.mk中增加下面的内容

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8

在Android.mk中增加下面的内容

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)


OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off

OPENCV_LIB_TYPE :=STATIC

ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include ..\..\..\..\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif

LOCAL_MODULE := OpenCV

LOCAL_SRC_FILES :=

LOCAL_LDLIBS +=  -lm -llog

include $(BUILD_SHARED_LIBRARY)

这时候,使用gradle构建一下,如果能成功构建出so,说明配置没问题,如下图,点击as右侧的gradle展开,双击ndkBuild进行构建

声明java层的native方法(这里就是随便写了一个add的方法,实际用的时候按照需求写哈)

public class OpenCVHelper {
    static {
        System.loadLibrary("OpenCV");
    }
    public static native int[] add(int a, int b);
}

然后就是我当时最头疼的命令了,首先,打开终端,先进入到你的工程文件中的app目录下,

cd /Users/orekinana/Desktop/code/Opencv2/app/

然后用javac创建类文件,这里我是把生成的类文件放到了bin文件夹下,

javac src/main/java/myfirstapp/orekinana/opencv/OpenCVHelper.java -d ./bin

然后啊,就该生成相应的头文件了,这里路径和文件名一定要完整,最后不能只写OpenCVHelper啊啊啊啊啊,会死的啊啊啊啊啊啊!!!

javah -jni -classpath ./bin -d ./src/main/java/myfirstapp/orekinana/opencv myfirstapp.orekinana.opencv.OpenCVHelper

然后在Jni里新建一个cpp和h文件,把之前h文件中的内容拷贝过去原来的就可以不要辣~然后在cpp文件中实现与之前设定的函数相对应的方法,这样我们之前在java文件中所定义的gray函数就可以用啦~这里给出例子中相对应的cpp实现哈~

#include "myfirstapp_orekinana_opencv_OpenCVHelper.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>

using namespace cv;

JNIEXPORT jintArray JNICALL Java_myfirstapp_orekinana_opencv_OpenCVHelper_gray(int a, int b);

JNIEXPORT jintArray JNICALL Java_myfirstapp_orekinana_opencv_OpenCVHelper_gray(int a, int b) {
    return a + b;
}

之后,需要将cpp文件编译进去,在Andorid.mk文件中加入

LOCAL_SRC_FILES := myfirstapp_orekinana_opencv_OpenCVHelper.cpp

然后在java层写个测试方法测试一下是否正常运行了

int a = 1, b = 1, c = 0;
c = add(a, b);
cout << c << endl;
return 0;

如果没有问题的话呢,就大功告成辣~(啪啪啪鼓个掌
然后我们就可以把刚刚用来测试的gray函数啊,cpp啊,java啊这里面的内容都可以删掉啦,然后就可以开始写你喜欢的东西辣,当然修改了之后步骤还是跟上面一样哈,在java里写好需要的接口然后哔哔哔的把那些命令们一敲,然后就在cpp文件夹里实现这些接口,然后我们就可以光明正大的在里main函数里玩儿辣咩哈哈哈哈哈~(虽然我的外表是java,但是我的心还是c++的!手动鼓掌!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值