gpt4 book ai didi

java - Swig 如何定义将 C 类型定义的 boolean 值转换为 java boolean 值的类型映射

转载 作者:搜寻专家 更新时间:2023-11-01 08:28:49 27 4
gpt4 key购买 nike

我正在使用 swig 在 C 和 Java (Android) 之间创建粘合剂。我在 C 中定义了一个 Boolean 类型并像这样使用: (MyGlue.h)

typedef enum boolean {
TRUE = 0x1,
FALSE = 0x0
} Boolean;

Boolean booleanValue = TRUE;

Boolean isRunning() {
return booleanValue;
}

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

if(MyGlue.isRunning) {
..do something..
}

我遇到的问题是 MyGlue.isRunning 返回一个 int

我可以制作一个将 int 转换为 boolean 值的 swig typemap 吗?

我尝试了以下,但我没有完全掌握 swig typmap 的用法:在我的 swig 配置文件中添加了以下内容

%typemap(out) Boolean {
$result = boolean($1);
}

我没有得到我想要的东西,此外我不知道把从 int 到 boolean 的转换放在哪里,比如 (return_value != 0) 我想我需要在类型映射中的某个地方指定。

是否可以使用 swig 实现这种转换,所以在外部我处理 boolean 值而不是整数?

最佳答案

你在类型映射的正确轨道上,事实上你可以使用输入/输出类型映射来完成它,但你还需要设置 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"

它具有始终在这里工作的硬编码魔数(Magic Number),因为您明确地给出了两个枚举成员值 0 和 1,但是如果您不能 100% 确定这对于更一般的枚举包装来说总是正确的,可能会导致一些奇怪的错误。

我之前暗示过,我们可以编写类型映射,将其作为 jboolean 从 native 代码一直传递到用户使用的代理类。这是真的,并且显然不需要沿途进行类型转换,但实际上我们可以利用现有的 SWIG 库对 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 文件以了解每个类型映射对生成的代码有什么影响。

关于java - Swig 如何定义将 C 类型定义的 boolean 值转换为 java boolean 值的类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com