【问题标题】:How to pass by reference in JNI?如何在 JNI 中通过引用传递?
【发布时间】: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


    【解决方案1】:

    unseal 中,而不是 JNI_ABORT 传递 0:

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2016-02-29
      • 2017-01-05
      • 2013-05-02
      • 2017-12-04
      • 2019-10-04
      • 1970-01-01
      • 2014-09-12
      • 2011-09-16
      相关资源
      最近更新 更多