【发布时间】:2016-06-16 20:18:52
【问题描述】:
好的,我知道以前有人问过这个问题,但我认为在这种情况下答案是不同的。所以基本上我有一个包含函数 seal 和 unseal 的 C 库,如下所示:
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;
}
基本上,seal 函数在 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 代码时,它会从 C 代码中的 printf 语句中打印出“hello”的字节。当我传入空缓冲区时,它被我最初密封的数据填充。这是正确的。但是,当我在 Java 中调用 unseal 函数后尝试打印填充的缓冲区时,它仍然返回空缓冲区。调用 C 函数后,如何让缓冲区从内存中更新?这可能吗?当我从 Java 而不仅仅是从 C 打印 emptybuf 时,我希望它打印出“hello”的字节。谢谢。
【问题讨论】:
标签: c reference java-native-interface buffer