2013-05-21 58 views
3

我看遍了所有的地方。我曾尝试过这个网站的一些技巧。无济于事。SWIG无符号字符和字节[]

我有一个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) 

如果删除无符号的我在cxx包装中得到非法转换

这是痛饮2.0.1

回答

2

你的界面接近,但有以下问题:为%apply

  • 您需要的符号/无符号限定词精确匹配为buff

    1. const事项(有在你展示的声明中没有限定词。
    2. 你在类型映射需要numinputs=1压缩它只有一个Java输入。
    3. 将大小设置为计算指针没有多大意义。

    所以固定接口的样子:

    %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是的,但问题在于如何将字符串映射到'char *',因为'jchar'与字符不同。你想要的字节数作为长度,或字符的数量? – Flexo

    +0

    字节数 – soandos

    相关问题