我是靠谱客的博主 生动乌龟,最近开发中收集的这篇文章主要介绍Android安卓java中jni使用opencv native1、创建项目,配置环境2、使用opencv编写自己的库3、生成库给其他人调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1、创建项目,配置环境
    • 1.1创建项目
    • 1.2、配置opencv的native环境
      • 1.2.1 引用目录和库目录配置
      • 1.2.2 CMakeLists.txt 库依赖
    • 1.3、已有项目添加jni支持
  • 2、使用opencv编写自己的库
  • 3、生成库给其他人调用

前面文章 Android安卓java中使用opencv-android-sdk已经简要介绍如何在Android中使用opencv_sdk_for_java。这里介绍如何使用jni调用c++的opencv库,使用cmake管理并编译生成so库供android使用。

1、创建项目,配置环境

1.1创建项目

创建 “Native C++” 项目,也可以在已有项目中通过修改build.gradle实现。
tool chain根据个人实际c++编码情况选择,这里选择的是c++14。
在这里插入图片描述
创建项目之后,直接编译运行,可以运行。
在OnCreate中调用native方法 stringFromJNI()从c++代码中返回一个字符串,显示在TextView中
在这里插入图片描述在这里插入图片描述在这里插入图片描述
若编译运行提示缺少 libc++_shared.so库,java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found。添加其支持,位于 build.gradle的defaultConfig->externalNativeBuild->cmake:
在这里插入图片描述

1.2、配置opencv的native环境

1.2.1 引用目录和库目录配置

在src下创建一个opencv目录,将sdk的E:AndroidProjectsOpenCV-4.2.0-android-sdksdknativejni的include目录复制到这里,用于引用c++头文件。。

在main下创建jniLib目录,并复制sdk中的E:AndroidProjectsOpenCV-4.2.0-android-sdksdknativelibs下所有文件到这里,用于打包到app中。(同文头提示文章 Android安卓java中使用opencv-android-sdk)

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

1.2.2 CMakeLists.txt 库依赖

在CMakeLists.txt文件的中添加 以下两行

include_directories(${CMAKE_SOURCE_DIR}/../../opencv/include)
link_directories(${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

在target_link_libraries括号中添加opencv库。完整如下

target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       #included in the NDK.
                       ${log-lib}
                       opencv_java4 )   ### 添加 opencv so库

至此,可以在cpp代码中可以使用opencv了。
例如,在native-lib.cpp中修改 stringFromJNI()函数, 编译运行即可。
在这里插入图片描述

1.3、已有项目添加jni支持

直接在app下右键,选择"Add C++ Module",将在main目录下添加cpp目录,目录下会增加如前面一样的默认C++项目,包含一个CMakeLists.txt和一个cpp文件。

2、使用opencv编写自己的库

以目标检测为例,cpp文件中创建自己的ObjectDetector类,
在这里插入图片描述
这里使用cmakelist.txt管理,简单起见,如下
在这里插入图片描述
这里项目编译成功之后之后,可以自测了。
例如,我们新增一个native方法
在这里插入图片描述
native-lib.cpp中实现增加代码,如下

/* file: native-lib.cpp   */

#include "ObjectDetection.h"

extern "C" JNIEXPORT jboolean JNICALL
Java_com_example_testjnilib_MainActivity_testObjDec(
        JNIEnv* env,
        jobject,
        jstring modelPath,
        jlong pImage)
{
    std::string path = env->GetStringUTFChars(modelPath, NULL);

    std::string weightsPath = path + "/yolov3_tiny_10000.weights";
    std::string configPath  = path + "/yolov3_tiny.cfg";

    ObjectDetection model;
    if(model.loadModel(weightsPath, configPath))  {
        // 加载失败
        return static_cast<jboolean>(false);
    }

    model.setParameters(0.00392, cv::Size(412,412));

    std::vector<int> classIds;
    std::vector<float> confidences;
    std::vector<cv::Rect> boxes;
    model.process(*((cv::Mat*)pImage), classIds, confidences, boxes);

    return static_cast<jboolean>(true);
}

3、生成库给其他人调用

我们实现了一个类ObjectDetection类供他人调用,应该给一个头文件、多平台的so库,应该如何实现? 这里直接使用cmakelists.txt文件,修改仅编译我们自己的h、cpp文件,并指定库的名称即可。

仍然在之前的工程项目中操作,改动删除,cmakelists.txt修改如下
在这里插入图片描述
由于使用之前的项目,不再生成native-lib库,而MainActivity.java中仍然加载 native-lib库,且使用对应的两个native方法

public native String stringFromJNI();
public native boolean testObjDec(String modelPath , long pImage);

若报错,注释掉这两个方法声明,同时也注释掉MainActivity.java中调用这两个方法的语句。
再编译即可,在app/build/intermediates/cmake/debug/obj下回生成对应配置和平台的库,如下
在这里插入图片描述
此时,我们给第三方使用这里的ObjectDetection动态库时,要提供给如下内容,并且还有opencv的include和so库。

├── ObjectDetection.h
└── jniLibs
    ├── arm64-v8a
    │   └── libobject_detection.so
    ├── armeabi-v7a
    │   └── libobject_detection.so
    ├── x86
    │   └── libobject_detection.so
    └── x86_64
        └── libobject_detection.so

他人使用时,复制jniLibs库,编写c++代码, 连接库,并需要在.java增加几个 System.loadLibrary,如

static {
    System.loadLibrary("opencv_java4");
    System.loadLibrary("object_detection");
}

测试代码同 小节 # 2、使用opencv编写自己的库。也可见 Android安卓中同时使用opencv_android_sdk和jni。

最后

以上就是生动乌龟为你收集整理的Android安卓java中jni使用opencv native1、创建项目,配置环境2、使用opencv编写自己的库3、生成库给其他人调用的全部内容,希望文章能够帮你解决Android安卓java中jni使用opencv native1、创建项目,配置环境2、使用opencv编写自己的库3、生成库给其他人调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部