c - JNI中如何通过引用传递?

标签 c reference java-native-interface buffer

好吧,我知道这个问题之前已经被问过,但我认为在这种情况下答案是不同的。所以基本上我有一个 C 库,其中包含函数 seal 和 unseal,如下所示:

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 端接收一个字节数组并将其存储在闪存中(不用担心它是如何工作的)并返回一个 token 。 unseal 函数接受一个空字节数组缓冲区和 token ,并用数据填充空缓冲区。现在这是 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”的字节。谢谢。

最佳答案

解封中,而不是 JNI_ABORT 传递 0:

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

关于c - JNI中如何通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868658/

相关文章:

javascript - 无法在 React Native 中使用 useRef() 将 current.focus() 应用于按钮

android - JNI : Catch NewStringUTF Inner-Exception

java - JNI C++ 到 Java 32 位图像无法正确显示

c - 在C中读取unicode文件时出错

c - GDB <Address 0xblablabla out of bounds> 错误

c - 错误: request for member ‘txt’ in something not a structure or union

c# - 引用类型与值类型

Ruby 变量引用其他变量

c - 使用 gets func 时 int var 的值是什么

java - 在 native c/c++ 代码中发生崩溃时,JVM 中的设置忽略 JRE 错误消息?