gpt4 book ai didi

java - 如何在传递给 JNI native C 调用的 Java 参数中存储值

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:25 25 4
gpt4 key购买 nike

我正在编写一个程序,它执行加密、签名等安全模块...我用 C 编写了库,它执行上述功能。现在我使用 jni 从 java 调用这个 C native 函数。

我面临的问题是我无法将结果(签名数据或加密数据)存储到java传递的参数中。我想将结果存储在我收到的参数中。请帮我。非常感谢。

以下是我在java中调用原生函数的API

sign("sign",byte[] file,int filelen,byte[] output,int outputlen)

在 native C 调用中,我将在"file"上执行符号,该文件是一个由输入文件内容组成的缓冲区,我想将其存储到输出中。我该怎么办谁可以帮助我我没有找到任何相关信息。

最佳答案

通常,使用直接 ByteBuffer 调用 native 库。

接口(interface)是MyClass.submit(ByteBuffer source, ByteBuffer dest)

static jmethodID ByteBuffer_position;
static jmethodID ByteBuffer_limit;

// Find method id's for ByteBuffer methods.
JNIEXPORT jint JNICALL Java_MyClass_initAPI
(JNIEnv *env, jclass thisj) {
jint error = 0;

ByteBuffer_position = (*env)->GetMethodID(env, byteBufferClass, "position", "()I");
if (ByteBuffer_position == NULL) error = -1;
ByteBuffer_limit = (*env)->GetMethodID(env, byteBufferClass, "limit", "()I");
if (ByteBuffer_limit == NULL) error = -1;

return error;
}

// Get ByteBuffer pointers and sizes and encrypt
// Expects source buffer's position to indicate end of source
// Expects dest buffer's limit to indicate max output length
JNIEXPORT jint JNICALL Java_MyClass_submit (JNIEnv *env, jobject thisj,
jobject sourceBuffer, jobject destBuffer ) {
jint error = 0;

unsigned char* sourcePtr = (*env)->GetDirectBufferAddress(env, source);
unsigned char* destPtr = (*env)->GetDirectBufferAddress(env, dest);
jlong sourceLen = (*env)->CallIntMethod(env, source, ByteBuffer_position);
jlong destLen = (*env)->CallIntMethod(env, dest, ByteBuffer_limit);

// Encrypt sourcePtr --> destPtr

return error;
}

这应该足以让大家理解这个想法。它是根据工作代码转述的,但未以当前形式进行测试。

关于java - 如何在传递给 JNI native C 调用的 Java 参数中存储值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11482663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com