簡體   English   中英

在Java中將C ++函數的返回類型映射為byte [] []

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM