Хорошо, я знаю, что этот вопрос задан раньше, но я думаю, что в этом контексте ответ отличается. Поэтому в основном у меня есть библиотека 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. Спасибо.