2011-09-21 8 views
2

に思えることSWIGポインタキャストis brokenオーバーライドSWIGは

*(int **)&jresult = result; // shenanigans 
return jresult; 

それは本当にただ

jresult= (jlong)result; 

がどのように私はどのようにキャストするためにそれを伝えるためにSWIGにフックすることができすべきですか?

答えて

1

タイプマップを使用できます。詳細はdoc hereを参照してください。おそらく以下のコードのように見えます。

%typemap(out) TYPE * 
%{ 
    *($&1_ltype)&$result = (jlong)$1; 
%} 
+0

あなたは一般的なのですか、これは文字通りのタイプマップですか? – paleozogt

+0

ジェネリックである。タイプはあなたのタイプでなければなりません。私が入れたものは近いはずです。 – Frohnzie

+0

*すべての*ポインタ型のtypemapを作成する必要がありますか?それは網羅的になるかもしれない。確かに、すべてのポインタのルールを指定する方法はありますか? – paleozogt

1

Frohnzieの答えは(すべての後に、それは、私が尋ねたものです)技術的に正しいですが、最善の解決策は、SWIGは、鋳造んどのようにハックするが、GCCに-fno-strict-aliasingを渡すことではありません。それは、具体的says what to do SWIGのドキュメントに埋もれ

重要

あなたが最適化を使用する場合は(たとえば -O2用)gccでオンになって、あなたはまたしてコンパイルすることを確認-fno-strict-aliasing。 GCC の最適化はgcc-4.0以降ではより積極的になり、 は厳密なエイリアス最適化で失敗したコードになります がオンになります。詳細については、C/C++ to Java typemapsセクションを参照してください。