gpt4 book ai didi

java - 将广泛的 C++ 库与具有非原始参数的 JNI 一起使用

转载 作者:行者123 更新时间:2023-11-28 07:07:51 25 4
gpt4 key购买 nike

我有一个用 Java 编写的应用程序,我有一个用于三角测量的 c++ 库(此处提供源代码:http://graphics.ucmerced.edu/software/tripath/index.html),我希望能够将其与 JNI 一起使用。该库基本上是根据您提供的点和边创建三角测量。您使用“空间”的起始信息初始化类并调用函数来修改您的三角剖分。最后,您可以使用将指向数组的指针作为参数的 getter 来访问点和边。我希望能够调用这些函数,并将相关信息存储在我定义的类中的 Java 对象中。

我以前从未使用过 JNI,所以我对此很陌生,而且它看起来非常复杂。 Oracle 的介绍和解释非常详细和冗长,我找到的所有教程都不适合我的需要。我看过的每个教程都只讨论了在 JNI 中使用原语和数组作为参数和返回类型,但我不知道如何处理更复杂的问题。

谁能解释如何创建 JNI 代码,为使用 C++ 类作为参数和返回类型的复杂函数提供包装器?如果您还可以链接到内容丰富的教程,那就太好了。

如果您想更好地了解问题,可以引用我正在处理的类(class)的一些摘录。如果您需要更多信息,我可以发布代码,或者您可以从我发布的链接下载源代码。谢谢!

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 调用保持在最低限度。

关于java - 将广泛的 C++ 库与具有非原始参数的 JNI 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com