Context
У меня есть код C ++ с перегрузкой int
и int64_t
, который мне нужно обернуть в Java
#include <cstdint>
int foo(int param);
int foo(int64_t param);
};
и этот swig
%{
#include <cstdint>
%}
%include "stdint.i"
%include "typemaps.i"
%ignore "";
%rename ("foo") foo(int);
%rename ("foo") foo(int64_t);
%include "foo.hpp";
G CC
При использовании G CC 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 ...) Ref: http://www.swig.org/Doc4.0/SWIGDocumentation.html#Java_default_primitive_type_mappings Sr c: https://github.com/swig/swig/blob/master/Lib/java/typemaps.i
Таким образом, оба этих метода будут иметь один и тот же прототип -> моя текущая проблема
AFAIK java / typemaps .i nor java .swg поддерживает переключатель SWIGWORDSIZE64
...
Протокол тестирования
Для воспроизведения проблемы (под ред. я использую 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 (ed вы можете нажать на значок, чтобы увидеть журналы / файлы)