2013-04-15 27 views
6

Chức năng có nguồn gốc Tôi muốn sử dụng đòi hỏi phải có một mảng của 7 Mat s:Vượt qua một mảng của Mats để mã gốc

static int nativeCode(cv::Mat &inputImg, cv::Mat bufImgs[7]); 

Trong jni_part tôi có:

Mat& mRgba = *(Mat*)inRgba; 
Mat& bufImgs[7] = *(Mat*)inBufImgs; 
nativeCode(mRgba,bufImgs); 

Trong Java của tôi mã tôi đang khai báo các trường của tôi:

private Mat mRgba; 
private Mat[] bufImgs = new Mat[7]; 

Tôi có thể gọi getNativeObjAddr trên mRgba, nhưng Ho w để tôi làm tương đương cho mảng?

Một số nền:

Tôi đang sử dụng OpenCV, đang xử lý hình ảnh trực tiếp với máy ảnh. Hàm tôi đang gọi trên mỗi khung hình yêu cầu một số đối tượng phụ. Để ngăn chặn việc tạo và phá hủy các đối tượng này mỗi khung hình, tôi muốn tạo chúng một lần và chỉ chuyển qua các tham chiếu trên mỗi lần.

Trả lời

5

Bạn phải chuyển đổi mảng tham chiếu đối tượng Java thành mảng gốc cv::Mat. Vì bạn có một phương thức để lấy địa chỉ của đối tượng gốc, điều đó khá đơn giản. Bạn tạo ra một phương pháp có nguồn gốc ở phía java:

public class MyClass { 
    private Mat mRgba; 
    private Mat[] bufImgs = new Mat[7]; 

    // set the fields and all... 
    // ... 

    // Call the native method 
    private native int callNativeCode(); 
} 

Sau đó trên mặt C/C++, bạn thực hiện callNativeCode như thế này:

JNIEXPORT jint JNICALL Java_MyClass_callNativeCode(::JNIEnv* env, jobject thisobject) 
{ 
    // Find the required classes 
    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); 

    // Convert the array 
    cv::Mat nativeBufImgs[7]; 
    for (int i = 0; i < 7; i++) 
     nativeBufImgs[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(bufimgsArray, i), getPtrMethod); 

    // Get the address for mRgba 
    cv::Mat* mrgbaptr = (cv::Mat*)env->CallLongMethod(mrgba, getPtrMethod); 

    // We're done! Call the method and return! 
    return nativeCode(mrgbaptr, nativeBufImgs); 
} 
+0

bạn có thể giải thích cú pháp của bạn tại 'GetFieldID (thisclass, "mRgba "," Lorg/opencv/lõi/Mat; ");' và 'GetFieldID (lớp này," bufImgs "," [Lorg/opencv/core/Mat; ");'. 'L' và' ['là gì? Đấu tranh để tìm tài liệu cho việc này. – fredley

+1

@TomMedley Mô tả lớp học trong JNI luôn giống như 'L ; '(với dấu gạch chéo thay vì dấu chấm, cũng đừng quên dấu chấm phẩy, đó là một sai lầm phổ biến). Các bộ mô tả mảng trông giống như '[>'. http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp16432 –

+0

Cảm ơn, được đánh giá cao. – fredley

Các vấn đề liên quan