1

please pardon me as I'm kindof new to c++ jni environment

I am trying to passing a String[] array from java through JNI bridge to c++ while following tips I found here giving this snippet:

void MyJNIFunction(JNIEnv *env, jobject object, jobjectArray stringArray) {

    int stringCount = env->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (env->GetObjectArrayElement(stringArray, i));
        const char *rawString = env->GetStringUTFChars(string, 0);
        // Don't forget to call `ReleaseStringUTFChars` when you're done.
    }
}

I have tried this in a lot of ways within my code but I am still getting a "broken irreparably" error from logcat and my app stopping. Please take a look at my code and help. Thank you so much in advance.

My code:

JNIEXPORT void Java_ran_com_FirstActivity_Example(
        JNIEnv *javaEnvironment, jobject self, jobjectArray stringArray, jlongArray params) {
    // Convert the input jlong array to a regular int array.
    jlong *longParams = javaEnvironment->GetLongArrayElements(params, JNI_FALSE);
    int arr[6];
    for (int n = 0; n < 6; n++) arr[n] = longParams[n];
    javaEnvironment->ReleaseLongArrayElements(params, longParams, JNI_ABORT);


    int stringCount = javaEnvironment->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 2));
        const char *rawString = javaEnvironment->GetStringUTFChars(string, 0);
        // a method I created
        example = new Example(rawString, arr);
        javaEnvironment->ReleaseStringUTFChars(string, rawString);
    }

}
Zaboj Campula
  • 3,155
  • 3
  • 24
  • 42
  • 1
    The jobjectArray and jlongArray passing is implemented correctly. The reason why you see an error is not in code showed in the question. The error might be - the shared lib is not in proper path. The Java_ran_com_FirstActivity_Example is not declared with extern "C", the jlongArray has less than 6 elements, the jobjectArray does not contain a string at index 2... – Zaboj Campula Nov 24 '16 at 12:16

2 Answers2

1
int stringCount = javaEnvironment->GetArrayLength(stringArray);

for (int i=0; i<stringCount; i++) {
    jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 2));

You may indeed intended to call the following line to enumerate through all strings in stringArray.

    jstring string = (jstring)(javaEnvironment->GetObjectArrayElement(stringArray, i);
    //i, not 2
timrau
  • 22,578
  • 4
  • 51
  • 64
1

Thank you so much timrau for giving me the confidence to look deeper into my "jni" code. I solved this issue finally by extracting the strings to chars before I passed them into the methods where I would be using them

JNIEXPORT void Java_ran_com_FirstActivity(JNIEnv *javaEnvironment, jobject self, jobjectArray stringArray) {

    int stringCount = javaEnvironment->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
            jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 0));
            const char *rawString = javaEnvironment->GetStringUTFChars(string, JNI_FALSE);

            jstring istring = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 1));
            const char *rawStringb = javaEnvironment->GetStringUTFChars(istring, JNI_FALSE);
            // I extracyed both string items to different chars before passing //to my methods...since jni only support passing two custom parameters
            example = new SuperpoweredExample(rawString, rawStringb);
            javaEnvironment->ReleaseStringUTFChars(string, rawString);
            javaEnvironment->ReleaseStringUTFChars(istring, rawStringb);
        }

}
E.Abdel
  • 1,992
  • 1
  • 13
  • 24