Java 将图像从android studio发送到cpp

Java 将图像从android studio发送到cpp,java,android,c++,android-studio,opencv,Java,Android,C++,Android Studio,Opencv,我们在安卓工作室做一个项目。 我们尝试将图像数组从java部分发送到cpp。 然后,我们要执行一些图像处理操作,然后将图像发送回java端 我们将每个图像表示为一个矩阵,并尝试创建要发送的矩阵数组。 我们尝试了几种不同的方法,但找不到正确的方法 Java: static Mat[] imageMats = new Mat[3]; @Override public void onClick(View v) { switch (v.getId()){

我们在安卓工作室做一个项目。 我们尝试将图像数组从java部分发送到cpp。 然后,我们要执行一些图像处理操作,然后将图像发送回java端

我们将每个图像表示为一个矩阵,并尝试创建要发送的矩阵数组。 我们尝试了几种不同的方法,但找不到正确的方法


Java:

static Mat[] imageMats = new Mat[3];

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.imageToUpload:
                Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(galleryIntent, RESUALT_LOAD_IMAGE);
                break;
            case R.id.bottonUpload:

                start(imageMats, counter)

public native Mat start(Mat[] imageMats, int N);


要将图像从Android部件传递到本机部件,可以使用NDK中的Android/bitmap.h

下面是一个将位图转换为Array2D(从dlib)的示例。我希望你能适应你的情况

#include "jni.h"
#include "android/log.h"
#include "android/bitmap.h"

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,    TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,     TAG, __VA_ARGS__)

void convertBitmapToArray2d(JNIEnv *env,
                            jobject bitmap,
                            dlib::array2d<dlib::bgr_pixel> &out) {
    AndroidBitmapInfo bitmapInfo;
    void *pixels;
    int state;

    if (0 > (state = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo))) {
        LOGE("AndroidBitmap_getInfo() failed! error=%d", state);
        return;
    } else if (bitmapInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGB_565!");
    }

    // Lock the bitmap for copying the pixels safely.
    if (0 > (state = AndroidBitmap_lockPixels(env, bitmap, &pixels))) {
        LOGE("AndroidBitmap_lockPixels() failed! error=%d", state);
        return;
    }

    LOGI("info.width=%d, info.height=%d", bitmapInfo.width, bitmapInfo.height);
    out.set_size((long) bitmapInfo.height, (long) bitmapInfo.width);

    char *line = (char *) pixels;
    for (int h = 0; h < bitmapInfo.height; ++h) {
        for (int w = 0; w < bitmapInfo.width; ++w) {
            uint32_t *color = (uint32_t *) (line + 4 * w);

            out[h][w].red = (unsigned char) (0xFF & (*color));
            out[h][w].green = (unsigned char) (0xFF & ((*color) >> 8));
            out[h][w].blue = (unsigned char) (0xFF & ((*color) >> 16));
        }

        line = line + bitmapInfo.stride;
    }

    // Unlock the bitmap.
    AndroidBitmap_unlockPixels(env, bitmap);
}
#包括“jni.h”
#包括“android/log.h”
#包括“android/bitmap.h”
#定义日志(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uError,TAG,\uuuVa\uArgs\uuuu)
#定义LOGI(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uInfo、标记、参数)
void convertBitmapToArray2d(JNIEnv*env,
jobject位图,
dlib::array2d和out){
AndroidBitmapInfo bitmapInfo;
空*像素;
int状态;
如果(0>(state=AndroidBitmap_getInfo(环境、位图和位图))){
LOGE(“AndroidBitmap_getInfo()失败!错误=%d”,状态);
返回;
}else if(bitmapInfo.format!=ANDROID\u位图\u格式\u RGBA\u 8888){
LOGE(“位图格式不是RGB_565!”);
}
//锁定位图以安全复制像素。
if(0>(state=AndroidBitmap_lockPixels(环境、位图和像素))){
LOGE(“AndroidBitmap_lockPixels()失败!错误=%d”,状态);
返回;
}
LOGI(“信息宽度=%d,信息高度=%d”,位图信息宽度,位图信息高度);
设置大小((长)bitmapInfo.height,(长)bitmapInfo.width);
字符*行=(字符*)像素;
对于(int h=0;h>8));
out[h][w]。蓝色=(无符号字符)(0xFF&((*颜色)>>16));
}
line=line+bitmapInfo.stride;
}
//解锁位图。
AndroidBitmap_解锁像素(环境、位图);
}

感谢您的帮助,我们不知道如何在我们的项目中使用您的想法。
cpp:
jclass thisclass = env->GetObjectClass(thisobject);
jclass matclass = (env)->FindClass("org/opencv/core/Mat");

// Get methods and fields
jmethodID getPtrMethod = (env)->GetMethodID(matclass, "getNativeObjAddr", "()J");
jfieldID mrgbafieldid = env->GetFieldID(thisclass, "mRgba", "Lorg/opencv/core/Mat;");
jfieldID bufimgsfieldid = env->GetFieldID(thisclass, "bufImgs", "[Lorg/opencv/core/Mat;");

// Let's start: Get the fields
jobject mrgba = env->GetObjectField(thisobject, mrgbafieldid);
jobjectArray bufimgsArray = (jobjectArray)env->GetObjectField(thisobject, bufimgsfieldid);
D.sources[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(imageMats, i), getPtrMethod);
#include "jni.h"
#include "android/log.h"
#include "android/bitmap.h"

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,    TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,     TAG, __VA_ARGS__)

void convertBitmapToArray2d(JNIEnv *env,
                            jobject bitmap,
                            dlib::array2d<dlib::bgr_pixel> &out) {
    AndroidBitmapInfo bitmapInfo;
    void *pixels;
    int state;

    if (0 > (state = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo))) {
        LOGE("AndroidBitmap_getInfo() failed! error=%d", state);
        return;
    } else if (bitmapInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGB_565!");
    }

    // Lock the bitmap for copying the pixels safely.
    if (0 > (state = AndroidBitmap_lockPixels(env, bitmap, &pixels))) {
        LOGE("AndroidBitmap_lockPixels() failed! error=%d", state);
        return;
    }

    LOGI("info.width=%d, info.height=%d", bitmapInfo.width, bitmapInfo.height);
    out.set_size((long) bitmapInfo.height, (long) bitmapInfo.width);

    char *line = (char *) pixels;
    for (int h = 0; h < bitmapInfo.height; ++h) {
        for (int w = 0; w < bitmapInfo.width; ++w) {
            uint32_t *color = (uint32_t *) (line + 4 * w);

            out[h][w].red = (unsigned char) (0xFF & (*color));
            out[h][w].green = (unsigned char) (0xFF & ((*color) >> 8));
            out[h][w].blue = (unsigned char) (0xFF & ((*color) >> 16));
        }

        line = line + bitmapInfo.stride;
    }

    // Unlock the bitmap.
    AndroidBitmap_unlockPixels(env, bitmap);
}