2016-11-24 25 views
1

,請原諒我,我kindof新的C++ JNI環境正確的JNI轉換,從jobjectarray越來越陣列項目單獨爲const char

我想傳遞一個String []數組從Java通過JNI橋到C++而下面的提示我發現這裏給這個片斷:

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. 
    } 
} 

我已經在我的很多代碼中的方法試過,但我仍然得到來自logcat的一個「猛料打破」錯誤和我的應用程序停止。請看看我的代碼和幫助。提前謝謝你。

我的代碼:

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); 
    } 

} 
+1

jobjectArray和jlong​​Array傳遞正確實現。您看到錯誤的原因不在代碼中顯示的問題中。錯誤可能是 - 共享庫路徑不正確。 Java_ran_com_FirstActivity_Example沒有用extern「C」聲明,jlong​​Array有少於6個元素,jobjectArray在索引2處不包含字符串... –

回答

1

非常感謝timrau讓我有信心深入瞭解我的「jni」代碼。我終於解決了這個問題,通過提取串字符之前,我通過他們到那裏我會使用它們

JNIEXPORT無效Java_ran_com_FirstActivity(的JNIEnv * javaEnvironment,jobject自我,jobjectArray字符串數組){

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); 
    } 

方法}

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

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

你可能確實打算致電以下行通過所有字符串stringArray枚舉。

jstring string = (jstring)(javaEnvironment->GetObjectArrayElement(stringArray, i); 
    //i, not 2 
+0

謝謝timrau,我終於通過將字符串數組打包到工作對象中來解決這個問題 –