我有一个用Java编写的应用程序,我有一个用于三角测量的c ++库(这里给出的源代码:http://graphics.ucmerced.edu/software/tripath/index.html),我希望能够与JNI一起使用。该库基本上是根据您提供的点和边创建三角剖分。使用“space”的起始信息初始化类,并调用函数来修改三角测量。最后,您可以使用将数组指针作为参数的getter访问点和边。我希望能够调用这些函数,并将相关信息存储在我定义的类中的Java对象中。
我之前从未使用过JNI所以我对此非常陌生,看起来非常复杂。 Oracle的介绍和解释非常详细和冗长,我发现的所有教程都不适合我的需求。我看过的每个教程都只讨论了使用JNI中的原语和数组作为参数和返回类型,但我不知道如何处理更复杂的问题。
任何人都可以解释如何使用c ++类作为参数和返回类型来创建JNI代码,该代码为复杂函数提供包装吗?如果您还可以链接到信息丰富的教程,那将是非常棒的。
如果您想要更好地了解问题,请参阅我正在处理的课程的一些摘录。如果您需要更多信息,我可以发布代码,也可以从我发布的链接下载源代码。谢谢!
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;
}
答案 0 :(得分:1)
简而言之,您应该选择最适合您应用的JNI层。请记住,将上下文从Java切换到C ++(反之亦然)可能会产生很大的开销。将复杂对象从一个领域转换到另一个领域也是昂贵的。因此,最好保留尽可能多的数据封装在C ++中,并使JNI调用保持最小。