2016-06-29 3 views
1

私はJNI初心者であり、アンドロイドではそれほど良くないので注意してください。JNIで修正されたマットには、Javaの変更が反映されていません。

答えとしてhere私はjlong​​sとして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): [] 

ですか?

+1

'マットoutputMatは= *(マット*)outputAddr;'最も可能性の高いあなたの行列の* *のコピーを作成します。あなたは[MCVE](http://stackoverflow.com/help/mcve)を提供していないので、確かに言うことは不可能です。 –

答えて

0

あなたは指を右に置いてください。 Henleに感謝します。

次の作品は、Googleのためにもう少し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; 
} 

//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()); 
} 
関連する問題