具体情况如下:
在Android的一个项目中,我需要对一个Mat进行图像相关的操作。但由于OpenCV-android-sdk中的Java部分功能涵盖不完全,很多具体操作还是需要通过OpenCV-android-sdk中的NDK接口部分(不确定是不是这个名称)在C++代码中进行。
那么在此会遇到一个问题,首先在Java代码部分获取到一个Mat对象,应当如何才能将这个Mat对象传递给C++呢?
1. 在Java中声明native方法:
//Java中的native方法
private native int imageCVProcess(long mat_Addr_l, long mat_Addr_r);
2. 获取Java中的Mat对象的地址:
//获取Mat地址
originMat_Addr = originMat.getNativeObjAddr();
3. 将该Mat对象地址传递给native方法:
imageCVProcess(originMat_Addr);
4. 在C++代码中将该地址转换为Mat对象:
JNIEXPORT jint JNICALL Java_com_facepp_demo_util_ImageCV_imageCVProcess(JNIEnv *, jobject, jlong mat_Addr) {
//从Java获取Mat
Mat& originMat = *(Mat*)mat_Addr;
return 1;
public native void FindFeatures(long matAddrGr, long matAddrRgba);
mRgba = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
假设您想将本地cv::Mat对象传递给Java并将其转换为Bitmap 。在这种情况下,最好将其转换为jintArray ,因此我将使用该示例编写一个示例,但您可以轻松地修改该代码以使用jbyteArray代替请注意,在该代码中,我假设您的cv::Mat有4个通道(bgra),请相应地进行更改。 如果垫子是灰色的,则将r, g, b设置为相同的灰色,将a为255。如果垫子是bgr,则将a设置为2...
前文[【Android安卓中封装opencv jni代码为Java类】](https://wanggao1990.blog.csdn.net/article/details/105179822)简单介绍了jni代码封装为Java接口代码,直接使用opencv的Mat对象的nativeObj作为指针传递进行赋值,以及传递基础类型参数。本文将实现更为复杂的结构对象传递,首先介绍jni基本的数据类型、接口函数和使用示例,再根据一个示例c++封装Java接口,最后说明jni的复杂数据结构传递实现。
背景:利用c++编写了一个图片质量检测的代码,调用到了opencv,目前需要在linux下调用c++编译得到的.so文件,在java上进行部署运行。
在上一篇博客中已经详细介绍了如果编译并且调用.so文件,只是还未编译成功。经过这么多天的努力终于弄明白的整个流程,并且知道错误在哪儿了。
生成.so文件并调用
1.编译java并生成头文件
javac hello/hellojni.java
jav...
1. 建立java文件public class getImageFeature {static{System.loadLibrary("getImageFeatureDll");}public native int getImageFeatureByName(String filename);public native int getImageFeatureByMemory();public st...
#define ASSERT(status, ret) if (!(status)) { return ret; }
#define ASSERT_FALSE(status) ASSERT(status, false)
bool BitmapToMat(JNIEnv *...
在native.cpp中写入以下代码。
#include <jni.h>
#include <string&am
Java层作为应用层,需要启动一个c++服务,同时需要互相调用及数据交互。Java调用c++,并传递int型参数JNIEXPORT void JNICALL Java_com_lp_lcmedia_LCInterface_initJni(JNIEnv *env, jobject instance, jint mode) {}c++调用Java的非static方法需要有Java层的实例才能调用。在上