Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI中修改的Mat不反映Java中的更改_Java_Android_Opencv_Java Native Interface - Fatal编程技术网

JNI中修改的Mat不反映Java中的更改

JNI中修改的Mat不反映Java中的更改,java,android,opencv,java-native-interface,Java,Android,Opencv,Java Native Interface,我应该注意到我是一个JNI新手,安卓系统也不太好,所以请容忍我 根据答案,我将一个“输入”和一个“输出”Mat作为jlong传递给JNI,并对这两个Mat进行类型转换。但是,对我的输出表的更改在Java中似乎并没有出现。。。我不知道为什么。这是我的密码 //SimpleJNI.java Mat outputPoints = new Mat(); Native.getTagsDetails(image.getNativeObjAddr(), OutputPoints.getNativeObjAd

我应该注意到我是一个JNI新手,安卓系统也不太好,所以请容忍我

根据答案,我将一个“输入”和一个“输出”Mat作为jlong传递给JNI,并对这两个Mat进行类型转换。但是,对我的输出表的更改在Java中似乎并没有出现。。。我不知道为什么。这是我的密码

//SimpleJNI.java
Mat outputPoints = new Mat(); 
Native.getTagsDetails(image.getNativeObjAddr(), OutputPoints.getNativeObjAddr()); 
String Message = String.format("outputPoints.cols() = %d, outputPoints.rows() = %d, outputPoints.dims() = %d",
                                outputPoints.cols(),      outputPoints.rows(),      outputPoints.dims());
System.out.println(Message);
System.out.println("outputPoints.dump()");
System.out.println(outputPoints.dump());


…那么我错过了什么

你把手指放在上面。谢谢你,亨利先生

下面的内容很管用,为了谷歌的利益,它更像是一个MCVE

//native.cpp
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

JNIEXPORT int JNICALL Java_com_example_android_simplejni_Native_getTagsDetails(JNIEnv* env, jobject callingObject, jlong inputAddr,  jlongArray outputAddrs, jintArray tagValues)
{
    Mat * inputImage = (Mat*)inputAddr;
    Matx<float, 4, 2> tagData [2] = {Matx<float, 4, 2>( 1,  2,  3,  4,  5,  6,  7,  8), 
                                     Matx<float, 4, 2>(11, 12, 13, 14, 15, 16, 17, 18)};
    int ii = 0;
    jsize outputAddrsLen    = env->GetArrayLength(outputAddrs);
    jsize tagValuesLen      = env->GetArrayLength(tagValues);
    jlong * outputAddrsData = env->GetLongArrayElements(outputAddrs, 0);
    jint *    tagValuesData = env->GetIntArrayElements(tagValues, 0);
    for (Matx<float, 4, 2>  tag : tagData)
    {
        if ((ii >= outputAddrsLen) || (ii >= tagValuesLen))
            break;
        Mat * anOutputMat  = (Mat*)(outputAddrsData[ii]);
        tagValuesData[ii] = ii * -2;
        Mat coords(tag);
        *anOutputMat = coords.clone();
        ii++;
    }
    env->ReleaseLongArrayElements(outputAddrs, outputAddrsData, 0);
    env->ReleaseIntArrayElements(tagValues,   tagValuesData,   0);
    //return tagData.size();
    return 0;
} 
//native.cpp
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
JNIEXPORT int JNICALL Java_com_示例_android_simplejni_Native_getTagsDetails(JNIEnv*env、jobject callingObject、jlong InputAddress、jlong Array OutputAddress、jintArray tagValues)
{
Mat*输入图像=(Mat*)输入地址;
Matx tagData[2]={Matx(1,2,3,4,5,6,7,8),
Matx(11,12,13,14,15,16,17,18)};
int ii=0;
jsize outputAddrsLen=env->GetArrayLength(outputAddrs);
jsize tagValuesLen=env->GetArrayLength(tagValues);
jlong*outputAddrsData=env->GetLongArrayElements(outputAddrs,0);
jint*tagValuesData=env->GetIntarrayelElements(tagValues,0);
用于(Matx标记:tagData)
{
if((ii>=outputAddrsLen)| |(ii>=tagValuesLen))
打破
Mat*输出Mat=(Mat*)(输出数据[ii]);
tagValuesData[ii]=ii*-2;
Mat-coords(tag);
*anOutputMat=coords.clone();
ii++;
}
环境->发布LongArrayElements(输出地址,输出地址数据,0);
环境->发布协议(tagValues,tagValuesData,0);
//返回tagData.size();
返回0;
} 

//simpleJNI.java
@凌驾
已连接管理器上的公共无效(int状态)
{
如果(状态==LoaderCallbackInterface.SUCCESS)
System.out.println(“OpenCV加载成功”);
超级管理器已连接(状态);
Mat image=Imgcodecs.imread(“/storage/simulated/0/myJNI/chilitag screenshot.png”);
Mat输出点[]={new Mat(),new Mat()};
long outputAddrs[]={outputPoints[0]。getNativeObjAddr(),
outputPoints[1].getNativeObjAddr()};
int tagValues[]=新的int[2];
Native.getTagsDetails(image.getNativeObjAddr(),outputAddrs,tagValues);
对于(int ii=0;ii<2;ii++)
{
System.out.println(“outputPoints[“+ii+”].dump():”;
System.out.println(outputPoints[ii].dump());
System.out.println(“tagValues[“+ii+”]=“+tagValues[ii]);
}
tv.setText(“chilitag结果:+outputPoints.toString());
}

你把手指放在上面。谢谢你,亨利先生

下面的内容很管用,为了谷歌的利益,它更像是一个MCVE

//native.cpp
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

JNIEXPORT int JNICALL Java_com_example_android_simplejni_Native_getTagsDetails(JNIEnv* env, jobject callingObject, jlong inputAddr,  jlongArray outputAddrs, jintArray tagValues)
{
    Mat * inputImage = (Mat*)inputAddr;
    Matx<float, 4, 2> tagData [2] = {Matx<float, 4, 2>( 1,  2,  3,  4,  5,  6,  7,  8), 
                                     Matx<float, 4, 2>(11, 12, 13, 14, 15, 16, 17, 18)};
    int ii = 0;
    jsize outputAddrsLen    = env->GetArrayLength(outputAddrs);
    jsize tagValuesLen      = env->GetArrayLength(tagValues);
    jlong * outputAddrsData = env->GetLongArrayElements(outputAddrs, 0);
    jint *    tagValuesData = env->GetIntArrayElements(tagValues, 0);
    for (Matx<float, 4, 2>  tag : tagData)
    {
        if ((ii >= outputAddrsLen) || (ii >= tagValuesLen))
            break;
        Mat * anOutputMat  = (Mat*)(outputAddrsData[ii]);
        tagValuesData[ii] = ii * -2;
        Mat coords(tag);
        *anOutputMat = coords.clone();
        ii++;
    }
    env->ReleaseLongArrayElements(outputAddrs, outputAddrsData, 0);
    env->ReleaseIntArrayElements(tagValues,   tagValuesData,   0);
    //return tagData.size();
    return 0;
} 
//native.cpp
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
JNIEXPORT int JNICALL Java_com_示例_android_simplejni_Native_getTagsDetails(JNIEnv*env、jobject callingObject、jlong InputAddress、jlong Array OutputAddress、jintArray tagValues)
{
Mat*输入图像=(Mat*)输入地址;
Matx tagData[2]={Matx(1,2,3,4,5,6,7,8),
Matx(11,12,13,14,15,16,17,18)};
int ii=0;
jsize outputAddrsLen=env->GetArrayLength(outputAddrs);
jsize tagValuesLen=env->GetArrayLength(tagValues);
jlong*outputAddrsData=env->GetLongArrayElements(outputAddrs,0);
jint*tagValuesData=env->GetIntarrayelElements(tagValues,0);
用于(Matx标记:tagData)
{
if((ii>=outputAddrsLen)| |(ii>=tagValuesLen))
打破
Mat*输出Mat=(Mat*)(输出数据[ii]);
tagValuesData[ii]=ii*-2;
Mat-coords(tag);
*anOutputMat=coords.clone();
ii++;
}
环境->发布LongArrayElements(输出地址,输出地址数据,0);
环境->发布协议(tagValues,tagValuesData,0);
//返回tagData.size();
返回0;
} 

//simpleJNI.java
@凌驾
已连接管理器上的公共无效(int状态)
{
如果(状态==LoaderCallbackInterface.SUCCESS)
System.out.println(“OpenCV加载成功”);
超级管理器已连接(状态);
Mat image=Imgcodecs.imread(“/storage/simulated/0/myJNI/chilitag screenshot.png”);
Mat输出点[]={new Mat(),new Mat()};
long outputAddrs[]={outputPoints[0]。getNativeObjAddr(),
outputPoints[1].getNativeObjAddr()};
int tagValues[]=新的int[2];
Native.getTagsDetails(image.getNativeObjAddr(),outputAddrs,tagValues);
对于(int ii=0;ii<2;ii++)
{
System.out.println(“outputPoints[“+ii+”].dump():”;
System.out.println(outputPoints[ii].dump());
System.out.println(“tagValues[“+ii+”]=“+tagValues[ii]);
}
tv.setText(“chilitag结果:+outputPoints.toString());
}
Mat outputMat=*(Mat*)outputAddr最有可能生成矩阵的副本。由于您尚未提供,因此无法确定。
Mat outputMat=*(Mat*)outputAddr最有可能生成矩阵的副本。由于您尚未提供详细信息,因此无法确定。
//native.cpp
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

JNIEXPORT int JNICALL Java_com_example_android_simplejni_Native_getTagsDetails(JNIEnv* env, jobject callingObject, jlong inputAddr,  jlongArray outputAddrs, jintArray tagValues)
{
    Mat * inputImage = (Mat*)inputAddr;
    Matx<float, 4, 2> tagData [2] = {Matx<float, 4, 2>( 1,  2,  3,  4,  5,  6,  7,  8), 
                                     Matx<float, 4, 2>(11, 12, 13, 14, 15, 16, 17, 18)};
    int ii = 0;
    jsize outputAddrsLen    = env->GetArrayLength(outputAddrs);
    jsize tagValuesLen      = env->GetArrayLength(tagValues);
    jlong * outputAddrsData = env->GetLongArrayElements(outputAddrs, 0);
    jint *    tagValuesData = env->GetIntArrayElements(tagValues, 0);
    for (Matx<float, 4, 2>  tag : tagData)
    {
        if ((ii >= outputAddrsLen) || (ii >= tagValuesLen))
            break;
        Mat * anOutputMat  = (Mat*)(outputAddrsData[ii]);
        tagValuesData[ii] = ii * -2;
        Mat coords(tag);
        *anOutputMat = coords.clone();
        ii++;
    }
    env->ReleaseLongArrayElements(outputAddrs, outputAddrsData, 0);
    env->ReleaseIntArrayElements(tagValues,   tagValuesData,   0);
    //return tagData.size();
    return 0;
} 
//simpleJNI.java
@Override
public void onManagerConnected(int status) 
{
    if (status == LoaderCallbackInterface.SUCCESS)
        System.out.println("OpenCV loaded successfully");
    super.onManagerConnected(status);
    Mat image = Imgcodecs.imread("/storage/emulated/0/myJNI/chilitag-screenshot.png"); 

    Mat outputPoints[] = {new Mat(), new Mat()};
    long outputAddrs[] = {  outputPoints[0].getNativeObjAddr(),
                                    outputPoints[1].getNativeObjAddr()};
    int tagValues[] = new int[2];
    Native.getTagsDetails(image.getNativeObjAddr(), outputAddrs, tagValues); 
    for (int ii = 0; ii < 2; ii++)
    {
        System.out.println("outputPoints[" + ii + "].dump():");
        System.out.println(outputPoints[ii].dump());    
        System.out.println("tagValues[" + ii + "] = " + tagValues[ii]);
    }
    tv.setText("chilitag results: " + outputPoints.toString());
}