Я бы лучше использовал прямой JNI вместо SWIG, чтобы иметь полный контроль над такими типами данных.
В любом случае возвращение char **
неэффективно, поскольку закрепление массива не может бытьиспользуемый.Вероятно, поэтому ваша оболочка 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;
}