2017-02-17 8 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; 
} 

:

if(MyGlue.isRunning) { 
    ..do something.. 
} 

나는 것입니다이 문제 MyGlue.isRunning은 int를 반환합니다.

int를 부울 값으로 변환하는 swig typemap을 만들 수 있습니까?

나는 다음을 시도,하지만 난 완전히 꿀꺽 꿀꺽 typmap의 사용 파악하지 않았다 : 내 꿀꺽 꿀꺽 설정 파일에 내가 외에, 내가 원하는 것을 얻지 못하고있어 follwing을

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

추가 (return_value! = 0)처럼 int에서 int 로의 변환을 어디에 넣어야할지 모르겠다. 그래서 typemap 어딘가에서 지정해야한다고 생각한다.

외부 변환으로이 변환을 수행 할 수 있습니까? 정수가 아니라 부울을 처리합니까?

답변

2

올바른 형식의 입력기를 사용 중이며 입력/출력 형식 맵을 사용하여 수행 할 수 있지만 jstype/jnitype/jtype typemap도 설정해야합니다. 생성 된 메소드.

일반적으로 Java typemaps에는 C -> JNI intermediate-> Final Java types의 변환이 있습니다. typemap을 직접 작성하는 경우 "최종 Java 유형"단계에서이를 수행하면 가장 적은 typemap으로 코드를 작성할 수 있습니다. 나는 그것이 무엇인지를 보여주기 위해 모범을 보였습니다. 실제로 그것은 단지, javaout 및 jstype적인 typemap을 javain 변경 수단 :

이 코드는 정말 조금 장황

%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을 생성했습니다. 나는 그것을 단지 복잡한 enum과 상호 작용할 수있는 방법을 보여주기 위해 작성했습니다. 그래서 우리가 쓸 수 : 명시 적으로 0과 1의 정확히 두 개의 열거 형 멤버 값을 주었기 때문에 항상 여기에 작동합니다 하드 코딩 된 매직 넘버를 가지고 있지만 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에서 나오는 C 스타일의 캐스트가 0/1 값을 원하기 때문에 작동합니다.)

그래서 우리는 사실 간단하게 작성할 수 있습니다

%module test 

%{ 
#include "test.h" 
%} 

%apply bool { enum boolean }; 

%include "test.h" 

복사 bool적인 typemap을 우리에게 enum boolean적인 typemap에.어떤 이유로 든 typemap의 일부 또는 일부를 조정하고 싶다면이 작업을 수행하기위한 기초로 사용할 수 있으며 중요하게 필요한 부분을 변경하면됩니다. 모든 시도 :

에게 이

결론 (이 단계에서 내가 제대로 지금 그것을 테스트하기 위해 손으로하는 JDK를하지 않는 출력을 컴파일 꿀꺽 꿀꺽 통해 위의 예제를 실행하고 검사가 아닌 한) 세 가지 제안 사항과 생성 된 testJNI.java, test.java 및 test_wrap.c 파일을 살펴보면 각 typemap이 생성 된 코드에 어떤 영향을 미치는지 알 수 있습니다.

+0

매력처럼 작동했습니다! – alexm