如何使用swig将对象数组传递给Java?

时间:2014-04-02 13:42:57

标签: java c java-native-interface swig

我正在开发一个Java应用程序,它具有来自本机c库的回调。回调传回以下c结构;

struct session
{
    unsigned media_count;/**< Number of media.      */
    media *media[10];   /**< Media array.   */

};

struct media
{
    struct
    {
        char    media_name[];   
    } desc;

/*
  Stuff im not interested in..  
*/
};

在swig界面文件中,我有以下内容;

core.i
------

typedef struct session
{
    unsigned    media_count;
} session;

然后在Java回调实现中,我最终得到了;

void call_back(session session) {
    session.get_media_count();
}

正如预期的那样,我现在想要将媒体数组暴露给Java。我有以下内容;

core.i
------

struct media
{
} media;

typedef struct session
{
    unsigned    media_count;
    media media[10];
} session;

但是这给了我一个Java的媒体项目,例如;

void call_back(session session) {
    session.get_media_count();
    media media = session.get_Media();
}

当我想要的时候;

void call_back(session session) {
    session.get_media_count();
    media[] media = session.get_Media();
}

1 个答案:

答案 0 :(得分:3)

不久之前,我通过创建一个自定义只读“类矢量”类来解决了类似的任务,其中at()方法在java级别上显示为get(int i)。主要思想是你不必在native和swig级别上拥有相同的类。实际上,您几乎独立于C / C ++级别构建SWIG级别。构造的关键方法是%extend SWIG-directive,如下所示:

%{
#include "session.h"
%}
%extend session {
    const media& getMedia(int i) {
        return media[i];
    }
}

但请注意,虽然表演这样的技巧,但我确实觉得我做的事情真的很邪恶。就像从“哈利波特”中学习黑暗势力一样;-)而且毕竟,我发现做很多Java&lt; - &gt;本机代码切换的效果并不像预期的那么好。

另外我怀疑你可以从本机代码返回一个“数组对象”并安全地从Java中使用它,因为这样的访问很大程度上依赖于低级数据对齐,而你没有直接翻译C级的方法没有额外复制的数据到Java级数据