2013-05-21 6 views
3

Я посмотрел повсюду. Я пробовал некоторые из методов на этом сайте. Но безрезультатно.SWIG unsigned char и byte []

У меня есть 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

ответ

2

Ваш интерфейс близок, но имеет следующие вопросы:

  1. const вопросы для %apply
  2. Вы должны точно соответствовать подписанным/без знака спецификатор для buff (там не является квалификатором в декларации, которую вы показали.
  3. Для того, чтобы сжать его только на один ввод Java, вам необходимо указать numinputs=1.
  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" 
+0

Есть ли способ, чтобы исправить подпись функции так, что он принимает только строку? – soandos

+0

@soandos yes, но вопрос в том, как вы хотите сопоставить строку с символом 'char *', поскольку 'jchar' не совпадает с символом. Вы хотите количество байтов как длину или количество символов? – Flexo

+0

Количество байт – soandos

Смежные вопросы