2013-04-20 3 views
0

В настоящее время я пытаюсь обернуть свою собственную библиотеку C++ для использования на Java (и, в конечном итоге, Android). Моя библиотека использует классы OpenCV Mat и Size в качестве входных данных. Ниже приведен пример SWIG интерфейс, что я до сих пор:Ссылка на определенные классы во внешней библиотеке с помощью SWIG

%module customLib 

%include <std_vector.i> 
%include <std_string.i> 

%{ 
#include "opencv2/core/core.hpp" 
#include "../include/myinc/CustomLib.h" 
%} 

namespace cv { 
    class Mat {}; 
    class Size {}; 
} 

namespace myinc { 
    CustomType preprocessMatrix(const cv::Mat& src, cv::Mat& dst, const cv::Size& ksize); 
} 

OpenCV имеет Java оберток для Mat и Size уже; Мне интересно, будет ли то, что я сделал здесь, вызвать конфликты имен, когда я добавлю собственную среду Java OpenCV. Правильно ли это включить ссылки на классы внешней библиотеки через SWIG? Или, есть ли лучший способ достичь этого?

ответ

1

Я понял, что это наконец! Мне потребовалось немного разобраться, как работает система типизации Java SWIG (большинство примеров замаскированы некоторыми важными концепциями).

Если у других возникли проблемы с пониманием того, как писать шаблоны Java, вот способ, который мне помог. Я решил, что проще всего просмотреть типовые схемы сверху вниз (т. Е. Java -> промежуточный JNI -> JNI). Сначала определите jstype как тип, который вы хотите видеть в ваших классах Java (например, module_name.java). Используйте javain, чтобы сообщить SWIG, как передать переменную из класса Java в промежуточный класс JNI (например, module_nameJNI.java). Затем определите jtype как тот же тип, что и javain. Например, $javainput.getNativeObjectAddr() возвращает long, так что это станет моим jtype. Наконец, определите jni как то, что будет использовать фактическая функция JNI.

Ниже, являются SWIG typemaps я придумал для запуска на верхней части интерфейса Java OpenCV (как в 2.4.5):

%typemap(jstype) cv::Mat& "org.opencv.core.Mat" 
    %typemap(javain) cv::Mat& "$javainput.getNativeObjAddr()" 
    %typemap(jtype) cv::Mat& "long" 
    %typemap(jni) cv::Mat& "jlong" 

    %typemap(in) cv::Mat& { 
      $1 = *(cv::Mat **)&$input; 
    } 

    %typemap(jstype) cv::Size& "org.opencv.core.Size" 
    %typemap(javain) cv::Size& "$javainput" 
    %typemap(jtype) cv::Size& "org.opencv.core.Size" 
    %typemap(jni) cv::Size& "jobject" 

    %typemap(in) cv::Size& { 
      jclass sizeClass = JCALL1(GetObjectClass, jenv, $input); 
      jfieldID widthFieldId = JCALL3(GetFieldID, jenv, sizeClass, "width", "D"); 
      jfieldID heightFieldId = JCALL3(GetFieldID, jenv, sizeClass, "height", "D"); 
      double width = JCALL2(GetDoubleField, jenv, $input, widthFieldId); 
      double height = JCALL2(GetDoubleField, jenv, $input, heightFieldId); 
      $1 = new cv::Size((int)width, (int)height); 
    } 

    %typemap(freearg) cv::Size& { 
      delete $1; 
    } 
Смежные вопросы