我有一个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将其转换为字节,我就会很高兴以任何方式恢复数据。
答案 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数组?”