2017-02-17 7 views
2

私はswigを使ってCとJava(Android)の間に接着剤を作成しています。 私はタイプCでブールを定義し、このように使用している: (MyGlue.h)Swype C typedefinedブールをJavaブールに変換するtypemapを定義する方法

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をブール値に変換するswig typemapを作成できますか?

私は次のことを試してみましたが、私は完全にSWIGのtypmapの使用状況を把握していなかった:私のSWIG設定ファイルの は私以外にも、私が欲しいもの届かないfollwing

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

を追加しましたintからboolean型への変換をどこに置くべきかわからない(return_value!= 0)ので、typemapのどこかに指定する必要があると思います。

この変換をswigで行うことは可能ですか?外部的にはブール値を扱い、intでは扱いませんか?

答えて

2

あなたはタイプマップで正しい軌道に乗っていますが、実際には入力/出力のタイプマップを使用することができますが、jstype/jnitype/jtypeタイプマップも設定する必要があります生成されたメソッド。

通常、Javaのtypemapsには、C-> JNI intermediate-> Final Java typesの変換があります。あなたがtypemapを書くのであれば、 "最終的なJavaの型"フェーズでそれを行うのが、必要なtypemapsを最小限にしてコードを書く最も簡単な場所になります。私はそれがどのようなものかを示す例をまとめました。実際にはそれだけで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は列挙型を生成しました。私は、それが大抵の場合、より複雑なenumとのやりとり方法を示すために書いています。だから我々は書かれている可能性があり:あなたが明示的に0と1のちょうど2つの列挙型メンバーの値が得られたので、いつもここで動作するハードコーディングされたマジックナンバーを持っていますが、あなたは100%で一定でない場合には、常にだ

%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" 

より一般的なenumラップを修正すると、いくつかの奇妙なバグにつながる可能性があります。

以前は、ネイティブコードからユーザーが使用するプロキシクラスまでのすべての方法でjbooleanとして渡すtypemapを書くことができると思いました。それは当てはまりますが、明らかに型の変換は必要ありませんが、現実にはカスタムの列挙型であっても、C++ bool型の既存のSWIGライブラリのサポートを引き出すことができます。 (これは、主にenum booleanのキャストスタイルのキャストがjbooleanの場合、0/1の値を期待しているため動作します)。

だから我々は、実際には、単に書くことができます。

%module test 

%{ 
#include "test.h" 
%} 

%apply bool { enum boolean }; 

%include "test.h" 

コピーboolタイプマップを私たちのためにenum booleanタイプマップへ。どのような理由であれ、これらのタイプマップの一部または一部を微調整したいのであれば、これを行うための基礎としてそれを使用して、必要なものを重要な場所に変更することができます。

(この段階で、私はSWIGを通じて上記の例を実行し、検査が、私は今それを適切にテストするために手にJDKを持っていないような出力をコンパイルしていませんでした)

ボトムライン:すべて試します3つの提案と、生成されたtestJNI.java、test.java、およびtest_wrap.cファイルを見て、各タイプマップが生成されたコードに与える影響を理解してください。

+0

チャームのように機能しました! – alexm

関連する問題