您将如何配置SWIG .i文件以处理C FILE *类型?下面的函数设置一个文件,以便可以将日志输出写入该文件。我需要从Java类中调用。当前,当我仅将C头文件包含在以下函数中时,SWIG将生成公共静态void setLogFile(SWIGTYPE_p_FILE fd)函数。有任何想法吗?
C函数:
void setLogFile(FILE *fd);
我尝试使用以下方法#1并得到以下异常:
test.i:
%module Example
%{
#include "headerLogFile.h"
%}
%inline %{
void setLogFile(const char *fn) {
FILE *f = fopen(fn, "w");
setLogFile(f);
}
%}
%ignore setLogFile;
%include "headerLogFile.h"
例外:
[exec] test_wrap.c:193: error: conflicting types for 'setLogFile'
[exec] /test/include/headerLogFile.h:96: error: previous declaration of 'setLogFile' was here
[exec] test_wrap.c: In function `setLogFile':
[exec] test_wrap.c:195: warning: passing arg 1 of `setLogFile' from incompatible pointer type
给定的test.h
看起来像:
#include <stdio.h>
inline void setLogFile(FILE *fd) {
fprintf(fd, "Test\n");
fflush(fd);
}
我可以看到您可能会选择使用三种方法来包装此函数:
方法1-String从Java传递a :
向Java公开一个函数,该函数期望文件名以而String不是a形式传递FILE*:
%module method1
%{
#include "test.h"
%}
%inline %{
void setLogFile(const char *fn) {
FILE *f = fopen(fn, "w");
setLogFile(f);
}
%}
这用于%inline指示SWIG在定义该函数的同时包装该函数。如果仍然使用,%include “test.h”则可能要对SWIG隐藏原始版本。
方法2-包装更多stdio.h:
包裹不止setLogFile,包裹的东西喜欢fopen,fmemopen等适当的。(我个人不太喜欢这种解决方案,因此我没有举一个例子)
方法3-公开一个带有以下内容的Java接口FileOutputStream:
%module method3
%{
#include "test.h"
#include <cassert>
%}
// 3:
%typemap(jni) FILE *fd "jobject"
// 1:
%typemap(jstype) FILE *fd "java.io.FileOutputStream"
// 2:
%typemap(jtype) FILE *fd "java.io.FileDescriptor"
// 4:
%typemap(in) (FILE *fd) {
jfieldID field_fd;
jclass class_fdesc;
int rawfd;
class_fdesc = jenv->FindClass("java/io/FileDescriptor");
assert(class_fdesc);
field_fd = jenv->GetFieldID(class_fdesc, "fd", "I");
assert(field_fd);
rawfd = jenv->GetIntField($input, field_fd);
$1 = fdopen(rawfd, "w");
// Add some code to throw a Java exception if $1 is NULL (i.e. error)
}
// 5:
%typemap(javain, pre=" retainFD = $javainput;",
throws="java.io.IOException") FILE *fd "$javainput.getFD()"
// 6:
%pragma(java) modulecode=%{
private static java.io.FileOutputStream retainFD;
%}
%include "test.h"
这将执行以下操作:
java.io.FileOutputStream
。java.io.FileDescriptor
。FileDescriptor
(请参见此处)。这可能不是便携式和阅读类私处通常被认为是不好的,但它使我们能够得到的东西我们可以通过fdopen()得到一个FILE*“真正”的号召FileOutputStream
并对其进行调用getFD()以获取其FileDescriptor
对象。它还添加了一个异常规范以匹配getFD()
并执行另一个功能,这是下一点的一部分FileOutputStream
,这将关闭文件句柄并使我们的无效FILE*。我们通过FileOutputStream
在private static
变量中引用我们来实现。在pre=”…以前的类型映射的原因最近的一次被保留,直到我们切换到另一个。(如果我们打电话setLogFile
两次,那没关系,实际上释放我们对前一个的引用是件好事FileOutputStream
)问题内容: 我正在尝试使用SWIG将C 类包装到Java类中。此类C 类具有引发异常的方法。 我有三个目标,尽管据我所知遵循了手册,但目前没有一个目标: 要使Java类在C ++中引发的方法上声明 要获取SWIG生成的Exception类以进行扩展 在生成的SWIG类中重写。 似乎问题的根源似乎没有应用我的,因为以上均未发生。我做错了什么? 最小的示例如下。C ++不必编译,我只对生成的Java感
问题内容: 我需要用SWIG包装一个C ++库,以便将其与Java一起使用。 我已经有一些方法可以使用,但是遇到一种我不知道如何解决的情况。 我有几种这样的方法: 注意:实际上,这是名为MyClass的类的成员方法。 我可以将第一个方法更改为返回a 而不是being ,它应该可以工作;但是我不知道如何处理第二种方法,其中最后两个参数是输出参数。我已经看到了几个有关输出参数的问题(使用Swig/ P
我已经创建了swig接口文件来为我的C文件创建JNI。但是我的一些C文件包含一些函数,这些函数接受指针作为参数,比如(void*),C BOOL和Swig将其转换为SWIGTYPE_p_int32_t如何从java传递这种数据类型? 例如,函数的一个实际原型在C中如下所示 它通过swig转换成Java文件 如何从java传递这样的值? 我有许多类在函数中包含此类参数。有什么方法可以让我尽可能简单地
在python中编写s时,如何处理输入值?。 重现错误的示例设置: 配置单元表: 输入txt: 失败次数最多的任务(4):-----任务ID:task_1560326504017_73073_m_000000 URL: ----此任务的诊断消息:错误:java.lang.RuntimeException:关闭org.apache.hadoop.Hive.ql.exec.mr.execmapper.
我想知道为什么Java程序在运行时只从命令行获取字符串形式的参数?我读过,如果参数声明为int,它仍然将int转换为字符串。为什么会出现这种情况?并且在运行java程序时,有没有办法只从命令行接受int值呢?
问题内容: 我想 在Solaris上 配置Java代理设置以使用代理自动配置(PAC)脚本。 我已经找到了使用Java控制面板在Windows机器上进行设置的说明,但是在查找Solaris Java安装的位置/如何进行相同设置更改时遇到了麻烦。 我想使用代理自动配置(PAC)脚本,而不是手动为每个连接设置代理信息,或使用单个代理。我需要针对不同类型的URL利用多个代理。 问题答案: 可悲的是,系统