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

如何使用swig将对象数组传递给Java?,java,c,java-native-interface,swig,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;

我正在开发一个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..  
*/
};
然后在Java回调实现中,我以

void call_back(session session) {
    session.get_media_count();
}
不过,正如预期的那样,我现在想将媒体阵列公开给Java。我有以下几点:

core.i
------

typedef struct session
{
    unsigned    media_count;
} session;
core.i
------

struct media
{
} media;

typedef struct session
{
    unsigned    media_count;
    media media[10];
} session;
但这给了我一个JavaEG中的单一媒体项

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();
}

不久前,我解决了一个类似的问题,创建了一个自定义的只读“类向量”类,该类的
at()
方法在java级别上公开为
get(inti)
。其主要思想是,您不必在本机和swig级别上拥有相同的类。实际上,您几乎独立于C/C++级别构建SWIG级别。构造的关键方法是
%extend
SWIG指令,如下所示:

%{
#include "session.h"
%}
%extend session {
    const media& getMedia(int i) {
        return media[i];
    }
}
但是要知道,当我表演这样的把戏时,我真的觉得我在做一些真正邪恶的事情。就像研究《哈利波特》中的黑暗力量一样——)毕竟,我发现做很多Javanative代码转换并没有预期的那么好


此外,我怀疑您能否从本机代码返回“数组对象”并从Java安全地使用它,因为这样的访问严重依赖于低级数据对齐,并且您没有无需额外复制即可将C级数据直接转换为Java级数据的方法。

不久前,我通过创建自定义只读使用
at()
方法作为
get(int i)公开的“类向量”类
在java级别上。其主要思想是您不必在本机和swig级别上拥有相同的类。实际上,您构建swig级别几乎独立于C/C++级别。构建的关键方法是
%extend
swig指令,类似这样:

%{
#include "session.h"
%}
%extend session {
    const media& getMedia(int i) {
        return media[i];
    }
}
但是请注意,当我表演这样的把戏时,我真的觉得我在做一些非常邪恶的事情。比如研究《哈利波特》中的黑暗力量(注-),毕竟,我发现做很多Javanative代码转换并没有预期的那么好


此外,我怀疑您能否从本机代码返回一个“数组对象”并从Java安全地使用它,因为这样的访问严重依赖于低级数据对齐,并且您没有无需额外复制即可将C级数据直接转换为Java级数据的方法。

不久前,我通过创建一个自定义只读类向量的“类,其
at()
方法公开为
get(inti)
在java级别上。其主要思想是您不必在本机和swig级别上拥有相同的类。实际上,您构建swig级别几乎独立于C/C++级别。构建的关键方法是
%extend
swig指令,类似这样:

%{
#include "session.h"
%}
%extend session {
    const media& getMedia(int i) {
        return media[i];
    }
}
但是请注意,当我表演这样的把戏时,我真的觉得我在做一些非常邪恶的事情。比如研究《哈利波特》中的黑暗力量(注-),毕竟,我发现做很多Javanative代码转换并没有预期的那么好


此外,我怀疑您能否从本机代码返回一个“数组对象”并从Java安全地使用它,因为这样的访问严重依赖于低级数据对齐,并且您没有无需额外复制即可将C级数据直接转换为Java级数据的方法。

不久前,我通过创建一个自定义只读类向量的“类,其
at()
方法公开为
get(inti)
在java级别上。其主要思想是您不必在本机和swig级别上拥有相同的类。实际上,您构建swig级别几乎独立于C/C++级别。构建的关键方法是
%extend
swig指令,类似这样:

%{
#include "session.h"
%}
%extend session {
    const media& getMedia(int i) {
        return media[i];
    }
}
但是请注意,当我表演这样的把戏时,我真的觉得我在做一些非常邪恶的事情。比如研究《哈利波特》中的黑暗力量(注-),毕竟,我发现做很多Javanative代码转换并没有预期的那么好


此外,我怀疑您能否从本机代码返回“数组对象”并从Java安全地使用它,因为这样的访问严重依赖于低级数据对齐,并且您没有无需额外复制即可将C级数据直接转换为Java级数据的方法

这是迄今为止最简单的(因此可能是最好的解决方案),但是我会添加一个
%ignore
指令,以避免生成混乱的
getMedia()
调用。据我所知,他/她没有
media*getMedia()
现在。但是,是的,如果它存在于C级,可以在Java级删除。感谢您的建议,最后我只制作了一个本机帮助函数来处理媒体:)这是迄今为止最简单的(因此可能是最好的解决方案),但是我会添加一个
%ignore
指令以避免产生混乱的
getMedia()
也可以调用。据我所知,他/她现在没有
媒体*getMedia()
。但是,如果它存在于C级,则可以在Java级删除。感谢您的建议,最后我只制作了一个本机帮助函数来处理媒体:)这是迄今为止最简单的(因此可能是最好的解决方案),但是我会添加一个
%ignore
指令,以避免生成混乱的
getMedia()
调用。据我所知,他/她没有
media*getMedia()
现在。但是,是的,如果它存在于C级,可以在Java级删除。感谢您的建议,最后我只制作了一个本机帮助函数来处理媒体:)这是迄今为止最简单的(因此可能是最好的解决方案),但是我会添加一个
%ignore
指令以避免产生混乱的
getMedia()
call。据我所知,他/她现在没有
media*getMedia()
。但是,如果它存在于C级,可以在Java级删除。谢谢