2016-06-16 2 views
0

Хорошо, я знаю, что этот вопрос задан раньше, но я думаю, что в этом контексте ответ отличается. Поэтому в основном у меня есть библиотека C, которая содержит функции уплотнения и распечатывания, которые выглядят так:Как пройти по ссылке в JNI?

JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1seal_1data 
(JNIEnv *env, jobject obj, jlong handle, jbyteArray data, jint size) 
{ 
    const char *cData = (*env)->GetByteArrayElements(env, data NULL); 
    jint token = securesdk_seal_data(handle, cData, size); 
    (*env)->ReleaseByteArrayElements(env, data, cData, JNI_ABORT); 
    return token; 
} 

JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1unseal_1data 
(JNIEnv *env, jobject obj, jlong handle, jint token, jbyteArray data, jint size) 
{ 
    const char *buffer = (*env)->GetByteArrayElements(env, data NULL); 
    jsize length = (*env)->GetArrayLength(env,data); 
    jlong address = securesdk_unseal_data(handle, token, buffer, size); 
    for(int i=0; i<length; i++){ 
     printf("%i\n", buffer[i]) 
    } 
    (*env)->ReleaseByteArrayElements(env, data, buffer, JNI_ABORT); 
    return address; 
} 

В основном функция уплотнения принимает массив байтов на стороне Java и сохраняет его в флэш-памяти (не волнуйтесь, как это работает) и возвращает токен. Функция unseal принимает пустой буфер байтового массива и токен и заполняет пустой буфер данными. Теперь вот код Java и то, что он выводит.

class JavaTest{ 
    public native int securesdk_seal_data(long handle, byte[] data, int size); 
    public native int securesdk_unseal_data(long handle, int token, byte[] data, int size); 

    JavaTest test = new JavaTest(); 
    String data = "hello"; 
    byte[] cmdbuf = data.getBytes(); 
    int token = test.securesdk_seal_data(sdk, cmdbuf, cmdbuf.length); 
    byte[] emptybuf = new byte[10]; 
    long returnData = test.securesdk_unseal_data(sdk, token, emptybuf, emptybuf.lenth); 

    for(int i=0; i<emptybuf.length; i++){ 
     System.out.print(emptybuf[i]); 
    } 
} 

Так что, когда я запускаю код Java, он выводит байты «привет» из оператора PRINTF в коде C. Когда я перехожу в пустой буфер, он заполняется данными, которые я запечатал первоначально. Это правильно. НО, когда я пытаюсь распечатать заполненный буфер после вызова функции unseal в Java, он все равно возвращает мне пустой буфер. Как я могу получить буфер для обновления из памяти после вызова функции C? Это возможно? Я бы хотел, чтобы он распечатывал байты «привет», когда я печатаю emptybuf из Java, а не только из C. Спасибо.

ответ

0

В распечатывания, вместо JNI_ABORT передать 0:

(*env)->ReleaseByteArrayElements(env, data, buffer, 0);