У меня есть приложение, написанное на 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;
}
В двух словах вы должны выбрать слой JNI, который наилучшим образом соответствует вашему приложению. Имейте в виду, что переключение контекста с Java на C++ и наоборот может иметь значительные накладные расходы. Превращение сложных объектов из одного царства в другое дорого. Поэтому предпочтительнее хранить как можно больше данных в инкапсулированном виде в C++ и поддерживать минимальные требования JNI.