上下文
我有一个带重载的c++代码 int
以及 int64_t
我需要 Package 成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时,将定义为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
避免 Package 器类型错误的问题
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中。。。
大口java
在java中,swig swig似乎 Package 了c++ long int
到c Package 器 int
(同时将2^64截断为2^32…)参考:http://www.swig.org/doc4.0/swigdocumentation.html#java_default_primitive_type_mappings src公司:https://github.com/swig/swig/blob/master/lib/java/typemaps.i
所以这两种方法将有相同的原型->我目前的问题
afaikjava/typemaps.i或java.swg支持 SWIGWORDSIZE64
切换。。。
测试协议
为了重现这个问题(我使用的是swig4.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 (您可以单击徽章查看日志/文件)
3条答案
按热度按时间pzfprimi1#
一个难看的解决方法是不使用
SWIGWORDSIZE64
,所以int64_t
将是typedef tolong long
它将被打印到jlong
. 请参见:http://www.swig.org/doc4.0/swigdocumentation.html#java_default_primitive_type_mappings但是,在c++warp文件中
long long
需要修补的(例如,使用后期处理)sed -i -e 's/long long/int64_t/g'
)否则编译失败,因为long long
类型不同于int64_t
(又名long int
)jchrr9hc2#
您可以尝试提供自己的类型Map。
hgb9j2n63#
既然你想重复使用
long long
类型Map: