2

I'm struggling with creating a 2d array of my custom object type ShareStruct:

jobjectArray ret ;
jobjectArray ins ;
jobjectArray outs;

jclass myClass = (*env)->FindClass(env,"org/apache/s4/core/ShareStruct");
if (myClass==NULL) fprintf(stderr, "Class ShareStruct not found");

jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct");
if (myClassArray==NULL) fprintf(stderr, "Class ShareStruct[] not found");

ins = (*env)->NewObjectArray(env, in, myClass, NULL);
outs = (*env)->NewObjectArray(env, out, myClass, NULL);
ret = (*env)->NewObjectArray(env, 2, myClassArray, NULL);

The first class loading works (the ShareStruct is fine), but the other one (trying to load a ShareStruct[] class) doesn't. I've tried both with and without the L but no luck. Any ideas? I'm new with JNI.

Thanks!

1
  • have updated my answer, did it help? Commented Aug 3, 2012 at 9:47

3 Answers 3

5

This jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct"); is wrong. To create the array do something like

 ret = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);  
(*env)->SetObjectArrayElement( env, ret,index, sharedStructObj);  

Here sharedStructObj will have to be created by newObject.
Section 3.3.5 of JNI programmer's guide has a good related example

This is also nice Create, populate and return 2D String array from native code (JNI/NDK)

EDIT based on comment

in = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
out = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
ret= (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
(*env)->SetObjectArrayElement( env, ret,0, in); 
(*env)->SetObjectArrayElement( env, ret,1, out); 
Sign up to request clarification or add additional context in comments.

3 Comments

But I want to create an array of ShareStruct[], so the java equivalent would be ShareStruct[][]. I don't see how this code does that :( Effectively, I want to do : ShareStruct[] in; ShareStruct[] out; ShareStruct[][] ret ; ret[0] = in ; ret[1] = out ;
This is a good answer, but "Section 3.3.5 of JNI programmer's guide has a good related example", link is dead as of 2016-05-18.
link to JNI Programmer's guide (Section 3.3.5 has the example mentioned by @CloudyTrees): barbie.uta.edu/~jli/Resources/…
1

You have to use an object array for the outer array:

jclass myClassArray = (*env)->FindClass(env, "[Ljava/lang/Object;");

in a similar case with a 2D String array worked for me. Please also recognize the trailing semicolon in the string.

Comments

1

I do not know if this question is still relevant, but I think you simply forgot the semicolon at the end of your array class specification:

jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct;");

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.