Swig如何定义将C类型定义的布尔值转换为java布尔值的类型映射
我正在使用swig在C和Java(Android)之间创建一个粘合剂。 我在C中定义了一个布尔类型,使用如下: (MyGlue.h) 然后在Java中,我要执行以下操作:Swig如何定义将C类型定义的布尔值转换为java布尔值的类型映射,java,android,c,swig,typemaps,Java,Android,C,Swig,Typemaps,我正在使用swig在C和Java(Android)之间创建一个粘合剂。 我在C中定义了一个布尔类型,使用如下: (MyGlue.h) 然后在Java中,我要执行以下操作: if(MyGlue.isRunning) { ..do something.. } 我遇到的问题是MyGlue.isRunning返回一个int 我可以制作一个swig类型映射,将int转换为布尔值吗 我尝试了以下方法,但没有完全掌握swig类型图的用法: 在我的swig配置文件中添加了以下内容 %typemap(o
if(MyGlue.isRunning) {
..do something..
}
我遇到的问题是MyGlue.isRunning返回一个int
我可以制作一个swig类型映射,将int转换为布尔值吗
我尝试了以下方法,但没有完全掌握swig类型图的用法:
在我的swig配置文件中添加了以下内容
%typemap(out) Boolean {
$result = boolean($1);
}
我没有得到我想要的,而且我不知道从int到boolean-like(return_-value!=0)的转换放在哪里,我想我需要在typemap中的某个地方指定它
有没有可能通过swig实现这种转换,所以我在外部处理布尔值而不是int值?您使用类型映射的方法是正确的,事实上,您可以使用in/out类型映射来完成转换,但是您还需要设置jstype/jnitype/jtype类型映射,以便更改生成方法的签名 一般来说,对于Java类型映射,有一个从C->JNI中间->最终Java类型的转换。如果您要自己编写一个类型映射,那么在“最终Java类型”阶段编写代码将是用最少的类型映射编写代码的最简单的地方。我举了一个例子来告诉你这是什么样的。实际上,这意味着只更改javain、javaout和jstype类型映射:
%module test
%{
#include "test.h"
%}
%typemap(jstype) enum boolean "boolean"
%typemap(javacode) enum boolean %{
public boolean toBoolean() {
return this == TRUE;
}
%}
%typemap(javaout) enum boolean {
return $javaclassname.swigToEnum($jnicall).toBoolean();
}
%typemap(javain) enum boolean "($javainput?Boolean.TRUE:Boolean.FALSE).swigValue()"
%include "test.h"
这段代码实际上有点冗长——javain类型映射可以简单地写为$javainput?0:1,javaout也可以同样简单,而不依赖SWIG生成的枚举。我这样写主要是为了展示它如何与更复杂的枚举交互。所以我们可以写:
%module test
%{
#include "test.h"
%}
%typemap(jstype) enum boolean "boolean"
%typemap(javaout) enum boolean {
return $jnicall != 0;
}
%typemap(javain) enum boolean "$javainput?1:0"
%include "test.h"
它有硬编码的幻数,在这里总是有效的,因为您明确地给出了两个枚举成员值0和1,但是如果您不能100%确定这对于更一般的枚举包装总是正确的,那么可能会导致一些奇怪的错误
我之前暗示过,我们可以编写类型映射,将其作为jboolean传递,从本机代码一直传递到用户使用的代理类。这是真的,并且不需要在类型上沿途进行类型转换,但是实际上我们可以利用现有的Sigg库支持C++ >代码> BOOL<代码>类型,甚至使用我们的自定义枚举。(这主要是因为从enum boolean
->jboolean
转换的C样式与我们希望的0/1值一样有效)
所以我们实际上可以简单地写下:
%module test
%{
#include "test.h"
%}
%apply bool { enum boolean };
%include "test.h"
它为我们将bool
类型映射复制到enum boolean
类型映射。无论出于何种原因,如果你确实想调整这些类型映射的某些/部分,你仍然可以将其作为这样做的基础,只需将你需要的更改到重要的地方
(在这个阶段,我已经通过SWIG运行了上面的示例,并检查了输出,但没有编译输出,因为我手头没有JDK来正确测试它)
一句话:尝试所有三个建议,并查看生成的testJNI.java、test.java和test_wrap.c文件,以了解每个类型映射对生成代码的影响
%module test
%{
#include "test.h"
%}
%apply bool { enum boolean };
%include "test.h"