使用带有非原始参数的JNI的扩展c ++库

时间:2014-02-01 21:34:07

标签: java c++ c java-native-interface

我有一个用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;
 }

1 个答案:

答案 0 :(得分:1)

简而言之,您应该选择最适合您应用的JNI层。请记住,将上下文从Java切换到C ++(反之亦然)可能会产生很大的开销。将复杂对象从一个领域转换到另一个领域也是昂贵的。因此,最好保留尽可能多的数据封装在C ++中,并使JNI调用保持最小。