[英]map return type of C++ function to byte[][] in Java
我有一個C ++函數聲明為
未簽名的字符**分類
我在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中的字節,我都會很高興以任何方式取回數據。
字符**不是字節[] []。 只有一維數組可以衰減為指針。 您得到的是一個指向數組的指針數組,而不是一個數組數組。
我最好使用直接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;
}
看看http://www.ibiblio.org/pub/languages/fortran/append-c.html “為什么不能將雙指針用作2D數組?”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.