2013-02-12 58 views
0

我必須從C++(jni)返回一個結構值數組到Java。我有C++ struture如下需要返回一個結構數組從jni到java(作爲對象數組)

MyCStructure 
{ 

byte *Data; 
int dataLength; 
int width; 
int height; 
}mycstr; 

,我有我的Java結構

public class MyJavaStructure 
{ 
    public byte[] Data; 
    public int dataLength; 
    public int width; 
    public int height; 
} 

而且我JavaMainClass.java

MyJavaStructure[] mystr = MyJavaStructure[4]; 
public native int Process(); 
public LSImage getValues() 
{ 
    return this.mystr ; 
} 
public void setValues(MyJavaStructure bDetails) 
{ 
    this.mystr = bDetails; 
} 

我試圖通過對象數組( MyJavaStructure)直接從JNI使用setValues的GetMethodId。

我JNI代碼是

JNIEXPORT jint JNICALL Java_TestJNI_Process(JNIEnv *jEnv, jobject jObj) 
{ 

    MyCStructure* mycstr = new MyCStructure[4]; 

    iRet = Process(&mycstr); 

    jclass jClass = jEnv->GetObjectClass(jObj); 
    jmethodID constructor; 


    jmethodID jObjectID = jEnv->GetMethodID (jLegendClass, "setValues", "(LMyCStructure;)V"); 
    if (jObjectID == NULL) 
    { 
     throwJavaException(jEnv, "Unable to find the method setValues"); 
     return NULL; 
    } 
    jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr); 

    printf ("After setting the output data value\n"); 

    jEnv->DeleteLocalRef(jClass); 

    return iRet; 
} 

在mycstr返回值包含4陣列結構(MyCStructure)值的和我試圖在一個MyJavaStructure類對象分配,但它返回null。

我在做對嗎還是在那裏我必須改變什麼?

回答

0
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr); 

你顯然不能那樣做。 mycstr不是jobject,既不指向jobjectjobject本身已經是一個指向不透明結構的指針,這不應該引起你的興趣,從而使你不依賴於特定的JNI實現。

C語言中的原生代碼可以理解Java類和對象,這要歸功於可從C調用的JNI函數。Java理解本機對象時沒有任何互補性。 所以答案是否定的,你做得不對。

如果你想Java和本機之間同步的結構(一個簡單的類),把類實例作爲jobject到本地通話,並使用GetFieldID之後(例如)Get/SetIntField

+0

如果它是一個單一的結構,我可以使用Get/Set Fields。我需要傳遞一些結構。 'mycstr'包含具有4個值的結構。 – Narayan 2013-02-13 10:01:01

+0

你的java方法'setValues(MyJavaStructure bDetails)'只接受一個實例,而不是一個數組,所以它不會工作。所以你需要將你的數組封裝在一個類中,並且有setDataLength(indexInArray,value)等類似的方法,並通過JNI調用它們。沒有繞過如何直接將C對象直接交給Java,真的。 – 2013-02-13 11:37:49

+0

好吧,我會找到一個合適的方式併發布它 – Narayan 2013-02-13 11:46:11

相關問題