Используйте обширную библиотеку c ++ с JNI с не примитивными аргументами

0

У меня есть приложение, написанное на Java, и у меня есть библиотека c++ для триангуляции (исходный код приведен здесь: http://graphics.ucmerced.edu/software/tripath/index.html), который я бы хотел быть в состоянии использовать с JNI. Библиотека в основном создает триангуляцию из точек и краев, которые вы ей даете. Вы инициализируете класс с помощью начальной информации о "пробеле" и вызовах для изменения триангуляции. Наконец, вы можете получить доступ к точкам и краям с помощью геттера, который принимает указатели на массивы в качестве параметров. Я хочу иметь возможность вызывать эти функции и хранить соответствующую информацию в объектах Java из классов, которые я определил.

Я никогда не использовал JNI, поэтому я очень новичок в этом, и он выглядит невероятно сложным. Внедрение и объяснение Oracle невероятно детализированы и длительны, и все найденные мной учебники не подходят для моих нужд. В каждом учебном пособии, который я рассмотрел, обсуждалось только с использованием примитивов и массивов в JNI в качестве параметров и типов возвращаемых данных, но я понятия не имею, как решать более сложные проблемы.

Может ли кто-нибудь объяснить, как создать код JNI, который предоставляет оболочку для сложных функций с использованием класса c++ в качестве параметров и типов возвращаемых данных? Если бы вы могли также ссылаться на информативный учебник, это было бы замечательно.

Вот некоторые отрывки из класса, с которым я имею дело, если вы хотите получить более полное представление о проблеме. Если вам нужна дополнительная информация, я могу либо отправить код, либо загрузить исходный код из ссылки, которую я опубликовал. Благодарю!

void SeDcdt::get_mesh_edges ( GsArray<GsPnt2>* constr, GsArray<GsPnt2>* unconstr )
 {
   SeDcdtEdge *e, *ei;
   SeDcdtSymEdge *s;
   GsArray<GsPnt2>* pa;

   if ( constr ) constr->size(0);
   if ( unconstr ) unconstr->size(0);

   e = ei = mesh()->first()->edg();

   do { if ( e->is_constrained() ) pa=constr; else pa=unconstr;
        if ( pa )
         { s = e->se();  pa->push() = s->vtx()->p;
           s = s->nxt(); pa->push() = s->vtx()->p;
         }
        e = e->nxt();
      } while ( e!=ei );
 }

int SeDcdt::insert_polygon ( const GsPolygon& pol )
 {
   int i, i1, id;
   SeVertex* v;
   SeFace* sface;

   _dcdt_changed = true;

   GS_TRACE1 ( "Inserting entry in the polygon set..." ); // put in _polygons
   id = _polygons.insert();
   InsPol& ip = *_polygons[id];
   ip.open = pol.open();

   GS_TRACE1 ( "Inserting polygon points..." ); // insert vertices
   sface = get_search_face();
   for ( i=0; i<pol.size(); i++ )
    { v = SeTriangulator::insert_point ( pol[i].x, pol[i].y, sface );
      if ( !v ) gsout.fatal ( "se_dcdt.cpp: search failure in _insert_polygon()." );
      ip.push() = (SeDcdtVertex*)v;
      sface = v->se()->fac();
    }

   // should we keep here collinear vertices (which are not corners)? 
   // they can be removed as Steiner vertices when removing another intersecting polygon

   _cur_search_face=0; // Needed because edge constraint may call kef

   GS_TRACE1 ( "Inserting polygon edges constraints..." ); // insert edges
   for ( i=0; i<ip.size(); i++ )
    { i1 = (i+1)%ip.size();
      if ( i1==0 && ip.open ) break; // do not close the polygon
      if ( !SeTriangulator::insert_line_constraint ( ip[i], ip[i1], id ) ) 
        gsout.fatal ( "se_dcdt.cpp: unable to insert constraint in _insert_polygon()." );
    }

   return id;
 }
  • 2
    thebreakfastpost.com/2012/01/21/...
  • 0
    Последняя страница этой ссылки очень полезна, спасибо!
Теги:
jni

1 ответ

1
Лучший ответ

В двух словах вы должны выбрать слой JNI, который наилучшим образом соответствует вашему приложению. Имейте в виду, что переключение контекста с Java на C++ и наоборот может иметь значительные накладные расходы. Превращение сложных объектов из одного царства в другое дорого. Поэтому предпочтительнее хранить как можно больше данных в инкапсулированном виде в C++ и поддерживать минимальные требования JNI.

  • 0
    Два вопроса. Во-первых, насколько плохи накладные расходы? Я буду вызывать функцию, которая возвращает массив точек каждую секунду или две. Второй вопрос: я пытался заставить базовый JNI HelloWorld работать в Eclipse в OS X, но у меня возникли некоторые проблемы. Любой совет? Вот тема, которую я сделал, чтобы задать вопрос: stackoverflow.com/questions/21515824/…
  • 0
    Говоря о накладных расходах, это зависит от платформы. 30 звонков в секунду - это нормально на моем телефоне Android Nexus 4, а 300 - нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню