gpt4 book ai didi

java - SWIG Java 在使用 -DSWIGWORDSIZE64 时将 int64_t 转换为 jlong

转载 作者:行者123 更新时间:2023-12-01 18:27:43 25 4
gpt4 key购买 nike

上下文

我有一个带有重载 intint64_t 的 C++ 代码,我需要将其包装为 Java

#include <cstdint>

int foo(int param);
int foo(int64_t param);
};

还有这一口

%{
#include <cstdint>
%}

%include "stdint.i"
%include "typemaps.i"

%ignore "";
%rename ("foo") foo(int);
%rename ("foo") foo(int64_t);

%include "foo.hpp";

海湾合作委员会

当使用GCC时,int64_t将被定义为long int

grepc -rn "typedef.*INT64_TYPE" /lib/gcc
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:43:typedef __INT64_TYPE__ int64_t;

然后

gcc -dM -E -x c++ /dev/null | grep __INT64
#define __INT64_TYPE__ long int

因此我使用 -DSWIGWORDSIZE64 来避免包装器类型错误问题

grep "int64" -C 1 /usr/local/share/swig/4.0.1/stdint.i 
#if defined(SWIGWORDSIZE64)
typedef long int int64_t;
#else
typedef long long int int64_t;
#endif

到目前为止一切顺利(至少在 python 和 csharp 中),但是在 Java 中......

SWIG Java

在 Java SWIG swig 中,似乎将 C++ long int 包装到 C Wrapper int (也将 2^64 截断为 2^32...)引用:http://www.swig.org/Doc4.0/SWIGDocumentation.html#Java_default_primitive_type_mappings来源:https://github.com/swig/swig/blob/master/Lib/java/typemaps.i

所以这两种方法将具有相同的原型(prototype) -> 我当前的问题

据我所知java/typemaps.i也不java.swg支持 SWIGWORDSIZE64 开关...

测试协议(protocol)

重现该问题(编辑我正在使用 swig 4.0.1)

mkdir -p gen
swig -DSWIGWORDSIZE64 -I. -c++ -java -o gen/foo_java_wrap.cc -package com.google.Foo -module main -outdir gen foo.i

观察

foo.hpp:9: Warning 516: Overloaded method baz(int64_t) ignored,
foo.hpp:8: Warning 516: using baz(int) instead.

cat gen/main.java
...
package com.google.Foo;

public class main {
public static int baz(int param) {
return mainJNI.baz__SWIG_0(param);
}

}

预期

cat gen/main.java
...
package com.google.Foo;

public class main {
public static int baz(int param) {
return mainJNI.baz__SWIG_0(param);
}
public static int baz(long param) {
return mainJNI.baz__SWIG_1(param);
}
}

那么我该如何处理这个问题呢?

谢谢

编辑:您可以在这里找到此示例:https://github.com/Mizux/swig_java(您可以单击徽章来查看日志/文件)

最佳答案

一个丑陋的解决方法是使用SWIGWORDSIZE64,因此int64_t将被typedef为long long 将被类型映射为 jlong​​。请参阅:http://www.swig.org/Doc4.0/SWIGDocumentation.html#Java_default_primitive_type_mappings

但是,在 C++ 扭曲文件中,您将有一些需要修补的long long(例如使用后期处理 sed -i -e 's/long long/int64_t/g') 否则编译会失败,因为 long longint64_t 类型不同(又名 long int)

关于java - SWIG Java 在使用 -DSWIGWORDSIZE64 时将 int64_t 转换为 jlong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205627/

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