Swig如何定义将C类型定义的布尔值转换为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

我正在使用swig在C和Java(Android)之间创建一个粘合剂。 我在C中定义了一个布尔类型,使用如下: (MyGlue.h)

然后在Java中,我要执行以下操作:

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"