在Java中将C ++函数的返回类型映射到byte [] []

时间:2011-01-12 19:15:46

标签: java c++ arrays swig

我有一个c ++函数声明为

unsigned char ** classify

我在SWIG中使用以下界面文件

%module PWrap
%include "std_string.i"
%include "arrays_java.i"

%apply byte[][] {unsigned char**};

%{
#include "Classifier.h"
%}

%include "Classifier.h"

生成了一些文件,包括SWIGTYPE_p_p_unsigned_char对象

现在,我尝试在Java中使用这个C ++函数:

SWIGTYPE_p_p_unsigned_char data = pc.classify();//this works, but I can't do anything with the data object execept pass it to other C++ functions expecting unsigned char**
byte[][] data2 =pc.classify();//this does not work - throws compile time error

那么我做错了让这个映射正常工作?我知道矩阵的维度,因为我将args传递给C ++函数来设置所有内容。换句话说,只要我能用Java将其转换为字节,我就会很高兴以任何方式恢复数据。

3 个答案:

答案 0 :(得分:3)

char **不是byte [] []。只有一维数组才能衰减成指针。你得到的是一个指向数组的指针数组,而不是数组数组。

答案 1 :(得分:2)

我最好使用直接JNI而不是SWIG来完全控制这些数据类型。

无论如何返回char **无效,因为array pinning无法使用。可能这就是为什么你的SWIG包装器没有做你想要的 - 你的classify应该接受char **作为参数而不是返回它。我不知道SWIG所以这里有一些JNI代码。

Java源代码:

package my;

public class Classifier {
    public native void init(); // initialize _ptr with a new Classifier
    public native void cleanup(); // destroy Classifier
    public native byte[][] classify();
    private long _ptr;
}

C / C ++中的方法定义:

Classifier *getClassifierInstance(JNIEnv *env, jobject obj) {
    jfieldID id = env->GetFieldID(env->GetObjectClass(obj), "_ptr", "J");
    return (id == NULL) ? NULL : ((Classifier *)env->GetLongField(obj, id));
}

JNIEXPORT jobjectArray JNICALL
Java_my_Classifier_classify(JNIEnv *env, jobject obj) {
    Classifier *classifier = getClassifierInstance(env, obj);
    char **ptr = classifier->classify();
    jobjectArray result = NewObjectArray(env, MATRIX_HEIGHT, FindClass(env, "[B"), NewByteArray(env, 0));
    for (int i = 0; i < MATRIX_HEIGHT; ++i) {
        jbyteArray row = NewByteArray(env, MATRIX_WIDTH);
        SetByteArrayRegion(env, row, 0, MATRIX_WIDTH, ptr[i]);
        SetObjectArrayElement(env, result, i, row);
    }
    return result;
}

答案 2 :(得分:1)

看看http://www.ibiblio.org/pub/languages/fortran/append-c.html“为什么双指针不能用作2D数组?”