Возвращая массив символов из Java в C - JNI - PullRequest
1 голос
/ 04 августа 2009

У меня есть хранилище объектов на Java. Моя C программа хранит данные (в виде массива char) в java. Теперь я хочу получить данные из моего магазина. Я не могу найти ни одного вызова функции, который возвращает мне массив символов. Как я могу это сделать?

1 Ответ

1 голос
/ 04 августа 2009

Вам необходимо использовать один из различных API, предоставляемых JNI, возможно, GetCharArrayElements ().

Ниже приведен пример, взятый из рабочего кода, который извлекает байтовый массив из Java в C (код - это функция, которая вызывается Java, но механизмы идентичны).

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 */
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...