3

私はあちこちを見てきました。このサイトのいくつかのテクニックを試しました。無駄に。

私はC++グローバル関数を持っています

char* squid( char* buff, int len );

.i ファイルを作成します

%module Crabby

%include "arrays_java.i"

%{
/* headers here are included in the wrapper code */
#include "sponge.h"
%}



%typemap(jtype) (const signed char *arr, size_t sz) "byte[]"
%typemap(jstype) (const signed char *arr, size_t sz) "byte[]"
%typemap(jni) (const signed char *arr, size_t sz) "jbyteArray"
%typemap(javain) (const signed char *arr, size_t sz) "$javainput"

%typemap(in) (const signed char* arr, size_t sz) {
  $1 = JCALL2(GetByteArrayElements, jenv, $input, NULL);
  const size_t sz = JCALL1(GetArrayLength, jenv, $input);
  $2 = $1 + sz;
}

%typemap(freearg) (const signed char *arr, size_t sz) {
  // Or use  0 instead of ABORT to keep changes if it was a copy
  JCALL3(ReleaseByteArrayElements, jenv, $input, $1, JNI_ABORT); 
}

%apply (const signed char* arr, size_t sz) { (const unsigned char* buff, int len) }
%apply (const signed char* arr, size_t sz) { (const unsigned char* query, int queryLen) }

%include "sponge.h"

私が何をしても、インターフェイスは常に

public static String Squid(String buff, int len)

unsigned を削除すると、cxx ラッパーで不正な変換が発生します

これはSwig 2.0.1です

4

1 に答える 1

2

インターフェイスは近いですが、次の問題があります。

  1. constにとって重要%apply
  2. の符号付き/符号なし修飾子を正確に一致させる必要がありますbuff(表示した宣言には修飾子がありません。
  3. in typemap はnuminputs=1、それを 1 つの Java 入力に圧縮する必要があります。
  4. サイズを計算されたポインターに設定することはあまり意味がありません。

したがって、固定インターフェイスは次のようになります。

%module Crabby

%include "arrays_java.i"

%{
/* headers here are included in the wrapper code */
#include "sponge.h"
%}

%typemap(jtype) (const signed char *arr, size_t sz) "byte[]"
%typemap(jstype) (const signed char *arr, size_t sz) "byte[]"
%typemap(jni) (const signed char *arr, size_t sz) "jbyteArray"
%typemap(javain) (const signed char *arr, size_t sz) "$javainput"

%typemap(in,numinputs=1) (const signed char* arr, size_t sz) {
  $1 = JCALL2(GetByteArrayElements, jenv, $input, NULL);
  const size_t sz = JCALL1(GetArrayLength, jenv, $input);
  $2 = sz;
}

%typemap(freearg) (const signed char *arr, size_t sz) {
  // Or use  0 instead of ABORT to keep changes if it was a copy
  JCALL3(ReleaseByteArrayElements, jenv, $input, $1, JNI_ABORT);
}

%apply (const signed char* arr, size_t sz) { ( char* buff, int len) }

%include "sponge.h"
于 2013-07-14T17:54:24.767 に答える