代码之家  ›  专栏  ›  技术社区  ›  DevSolar

有效地通过JNI的大型C结构

  •  2
  • DevSolar  · 技术社区  · 15 年前

    我有一个大的C结构(大约40个成员,int和char),我必须通过JNI到Java端进行进一步的处理。这种情况反复发生。(我已经把 GetMethodID() 等成 init() 函数在C端,因此我只需要调用它们一次。)

    有什么有效的方法可以做到这一点?

    我可以想到:

    1. 通过适当的成员实例化Java类 GetMethodID( ..., "<init>", ... ) 并使C结构的所有成员通过构造函数;
    2. 用适当的成员分配Java结构,并初始化(public)成员 SetXYZField() ;

    我忽略了什么吗?(这是我与JNI的第一次“近战”。难道真的没有一种有效的方式来“同步”一个C结构和一个Java结构吗?

    更有效的传递方法是什么,1。或者2。?如果是1,我应该通过 CallXYZMethod() (参数列表)或 CallXYZMethodA() (参数数组)?

    谢谢你的意见。

    编辑: 轻微返工;2.当然,不需要是一个类,如果在Java端处理C数据的其他解决方案,我不需要Java端上的结构。

    编辑2: 我在C++中这样做,但是Struts本身源于一个C链接回调函数,也就是说没有什么C++特定于这个问题。改为读“C”而不是“C++”。

    2 回复  |  直到 15 年前
        1
  •  1
  •   MHarris    15 年前

    为了提高效率,最好最小化通过JNI进行的调用,所以您最好的选择是通过选项1发送所有数据并创建一个新对象。

    你也可以有一个“ReceiveUpdate(…………………………………………………………………………………………………………………………………“40个PARAMS…”)如果你想避免每次更新分配一个新的对象,Java端的方法,尽管它是值得开发的设计。

        2
  •  1
  •   Henry B    15 年前

    很抱歉,我没有时间来写一个深入的答案或进一步研究这个问题,但不久前我不得不和JNI做了很多工作,我发现使用swig帮助很大。我不确定它的效率,但我认为它可以生成相当有效的代码。

    不管怎样,看看 SWiG 有点开着 Passing structures by value 和主要 Structures .

    祝你好运。