Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JNI setting Static Field String Array

I am trying to set a String Array field in my class but am running into all sorts of problems. This is what i have so far:

JNIEXPORT jint JNICALL Java__Names1_GetMyNames(JNIEnv *env, jobject obj)
{
jfieldID myNamesID; /* store the field ID */
int i=0;
jstring myStr;
jobject dev;
char* myNames[] = {"Hello ", "world!"};

// Get a reference to obj’s class 
jclass cls = env->GetObjectClass(obj);
// Get static field ID
myNamesID = env->GetStaticFieldID(cls, "myDevNames", "[Ljava/lang/String;");
// Get the object field
dev = env->GetObjectField(obj,myNamesID);

for (i=0; i<2; i++) {
myStr = env->NewStringUTF(myNames[i]);
env->SetObjectArrayElement(dev,i,myStr);
}
return 0;
}

and this is my string:

private static String[] myDevNames= new String[12];

When i try to compile i get the following error:

error: invalid conversion from 'jobject {aka _jobject*}' to 'jobjectArray {aka _jobjectArray*}' [-fpermissive]

Any ideas what i am doing wrong? Any help would be appreciated.

like image 202
CPL Avatar asked May 23 '26 08:05

CPL


1 Answers

Update - my previous recommendation to use jarray instead of jobject was incorrect. I was looking at old documentation. Based on http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html how about this? Redefine dev as jobjectArray, but you also need to do a cast on the call to GetStaticObjectField.

JNIEXPORT jint JNICALL Java__Names1_GetMyNames(JNIEnv *env, jobject obj)
{
jfieldID myNamesID; /* store the field ID */
int i=0;
jstring myStr;
jobjectArray dev;
char* myNames[] = {"Hello ", "world!"};

// Get a reference to obj’s class 
jclass cls = env->GetObjectClass(obj);
// Get static field ID
myNamesID = env->GetStaticFieldID(cls, "myDevNames", "[Ljava/lang/String;");
// Get the object field
dev = static_cast<jobjectArray>(env->GetStaticObjectField(cls,myNamesID));

for (i=0; i<2; i++) {
myStr = env->NewStringUTF(myNames[i]);
env->SetObjectArrayElement(dev,i,myStr);
}
return 0;
}
like image 133
Guido Simone Avatar answered May 24 '26 21:05

Guido Simone



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!