1
私はJNI初心者であり、アンドロイドではそれほど良くないので注意してください。JNIで修正されたマットには、Javaの変更が反映されていません。
答えとしてhere私はjlongsとしてJNIに "input"と "output" Matを渡していて、両方で型キャストを行っています。しかし、私の出力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());
//native.cpp
JNIEXPORT int JNICALL Java_com_example_android_simplejni_Native_getTagsDetails(JNIEnv*, jobject, jlong inputAddr, jlong outputAddr)
{
Mat inputImage = *(Mat*)inputAddr;
Mat outputMat = *(Mat*)outputAddr;
Mat calcMat;
TagCornerMap tagData = Chilitags().find(inputImage);
for (const pair<int, Matx<float, 4, 2>> & tag : tagData)
{
int id = tag.first;
Mat coords(tag.second);
if (calcMat.empty())
calcMat = coords;
else
hconcat(calcMat, coords, calcMat);
}
ALOGE("JET outputMat.total() = %i, outputMat.type() = %i, outputMat.dims = %i",
outputMat.total(), outputMat.type(), outputMat.dims);
ALOGE("JET calcMat.total() = %i, calcMat.type() = %i, calcMat.dims = %i",
calcMat.total(), calcMat.type(), calcMat.dims);
outputMat = calcMat.clone();
ALOGE("JET outputMat.total() = %i, outputMat.type() = %i, outputMat.dims = %i",
outputMat.total(), outputMat.type(), outputMat.dims);
return tagData.size();
}
ここで私は何をしないのです...私の日食出力
simplejni native.cpp(23056): JET outputMat.total() = 0, outputMat.type() = 0, outputMat.dims = 0
simplejni native.cpp(23056): JET calcMat.total() = 8, calcMat.type() = 5, calcMat.dims = 2
simplejni native.cpp(23056): JET outputMat.total() = 8, outputMat.type() = 5, outputMat.dims = 2
System.out(23056): outputPoints.cols() = 0, outputPoints.rows() = 0, outputPoints.dims() = 0
System.out(23056): outputPoints.dump()
System.out(23056): []
ですか?
'マットoutputMatは= *(マット*)outputAddr;'最も可能性の高いあなたの行列の* *のコピーを作成します。あなたは[MCVE](http://stackoverflow.com/help/mcve)を提供していないので、確かに言うことは不可能です。 –