2013-02-12 57 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

相关问题