JNI中修改的Mat不反映Java中的更改
我应该注意到我是一个JNI新手,安卓系统也不太好,所以请容忍我 根据答案,我将一个“输入”和一个“输出”Mat作为jlong传递给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
//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());
}