2009-08-04 16 views
1

Ich habe einen Objektspeicher in Java. Mein C-Programm speichert Daten in Form von Char-Array in Java. Jetzt möchte ich Daten aus meinem Geschäft abrufen. Ich kann keinen Funktionsaufruf finden, der mir ein Char-Array zurückgibt. Wie kann ich das machen?Rückgabe Char Array von Java zu C - JNI

+0

Ihre Frage muss noch ein wenig aufgeräumt werden. Wie speichert Ihr C-Programm etwas in Java? Haben Sie alle Zeichencodierungsprobleme herausgearbeitet? –

Antwort

1

Sie müssen eines der verschiedenen APIs verwenden, die von JNI bereitgestellt werden, wahrscheinlich GetCharArrayElements().

Es folgt ein Beispiel aus dem Arbeitscode, der ein Byte-Array von Java in C aufruft (der Code ist eine Funktion, die von Java aufgerufen wird, aber die Mechanik ist identisch).

JNIEXPORT void JNICALL Java_xxx_jniEnqueue(JNIEnv *jep,jobject thsObj, 
jlong handle, jbyteArray jvaKey, jint jvaKeyOfs, jint jvaKeyLen, jbyteArray jvaData, jint jvaDtaOfs, jint jvaDtaLen) { 
    jbyte   *jniKey,*jniData; 
    jthrowable  escObj; 

    jniKey=(*jep)->GetByteArrayElements(jep,jvaKey,0); 
    jniData=(*jep)->GetByteArrayElements(jep,jvaData,0); 
    ... 
    memcpy(odp->enqpfx->Msg,jniKey+jvaKeyOfs,(vuns)jvaKeyLen);    /* key badly named Msg */ 
    ... 
    // enqueue data using key 
    if(/* enqueue failed */) { 
     (*jep)->ReleaseByteArrayElements(jep,jvaKey ,jniKey ,JNI_ABORT); /* abort to not copy back */ 
     (*jep)->ReleaseByteArrayElements(jep,jvaData,jniData,JNI_ABORT); /* abort to not copy back */ 
     throwEscapeObject(jep,escObj); 
     return; 
     } 
    (*jep)->ReleaseByteArrayElements(jep,jvaKey ,jniKey ,JNI_ABORT); /* abort to not copy back */ 
    (*jep)->ReleaseByteArrayElements(jep,jvaData,jniData,JNI_ABORT); /* abort to not copy back */ 
    }