我正在开发一个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();
}
答案 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级数据