2014-01-11 2 views
0

поэтому у меня есть Строковый результатNative [] в Java и результат char [] [] в C++, как передать массив с java на C++ с помощью JNI? Я пробовал следующий код, но ошибка. Спасибо.Передача массива String от Java до C++

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj) { 
int size = env->GetArrayLength(resultNative); 

for (int i=0; i < size; ++i) 
{ 
    jstring string = env->GetObjectArrayElement(resultNative, i); 
    result[i] = env->GetStringUTFChars(string, i); 
    env->ReleaseStringUTFChars(string, resultNative); 
    env->DeleteLocalRef(string); 
} 

}

+0

Это может быть полезно, если бы вы также разместить фактическую ошибку вы получите. – Vadim

ответ

1

Я думаю, что вы должны сделать копию того, что GetStringUtf возвращается, прежде чем отпустить. В противном случае вы храните указатель на свободную память и, возможно, позже получите доступ к ней. Использование std: string - правильный способ сделать это на C++, но вы можете использовать strdup, если вы действительно настаиваете.

Если результатом является массив строки std: это так же просто, как результат [i] = std: string (env-> GetStringUTFChars (string, i));

+0

hmm. есть ли у вас пример того, как это сделать правильно? возможно, так, как я делаю это неправильно. Я новичок в этом и не очень знаком с C++ :( – user3158109

0

В вашем коде отсутствует параметр. Кроме того, вы выпускаете строку, прежде чем будете ее использовать. Присвоение его result[i] просто делает мелкую копию (копия указателя, а не содержимого). После его освобождения result[i] становится недействительным.

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj, jobject stringArray) 
{ 
    int length = env->GetArrayLength(stringArray); 

    for (int i = 0; i < length; ++i) 
    { 
     jstring jstr = (jstring) env->GetObjectArrayElement(stringArray, i); 
     const char* cpp_string = env->GetStringUTFChars(jstr, 0); 

     std::cout<<cpp_string<<"\n"; 

     env->ReleaseStringUTFChars(jstr, cpp_string); 
     env->DeleteLocalRef(jstr); 
    } 
} 

ИЛИ если вы хотите сохранить строку затем:

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj, jobject stringArray) 
{ 
    int length = env->GetArrayLength(stringArray); 

    std::vector<std::string> array_of_str(length); 

    for (int i = 0; i < length; ++i) 
    { 
     jstring jstr = (jstring) env->GetObjectArrayElement(stringArray, i); 
     const char* cpp_string = env->GetStringUTFChars(jstr, 0); 

     array_of_str.emplace_back(cpp_string); 

     env->ReleaseStringUTFChars(jstr, cpp_string); 
     env->DeleteLocalRef(jstr); 
    } 
} 
+0

спасибо, umm .. Я думаю, что я ошибаюсь в синтаксисе JNI, не могли бы вы мне помочь? http://stackoverflow.com/questions/21065390/get-java-array-from-c-via-jni – user3158109

Смежные вопросы