我是JNI和C的新手,我在解决如何完成这项任务时遇到了问题。
我有一个带有以下签名的本机C函数: void DoEncrypt(char * buffer,int * length) { ...加密缓冲区中的数据 ... ... }
我还有相反的方法在回来的路上做解密。我遇到的问题是,使用JNI,如何传递两个指针,然后通过包装器类或原始Java方法从其内存位置检索加密或解密的密码。
现在,我的想法是在C中编写一个包装器来调用DoEncrypt和DoDecrypt函数,它们将使用jobject和jstring来获取和输出密码值。
这是对的吗?它是最好/最简单/最快的方式吗?
感谢您分享的所有帮助。
谢谢,
查
答案 0 :(得分:0)
包装函数很好,因为您可以直接从C测试DoEncrypt和DoDecrypt。您可以像这样编写包装器:
void DoEncrypt_jni(JNIEnv** env, jarray* buffer, int* length) {
... call the real DoEncrypt ...
}
(自从我编写JNI功能以来已经很长时间了。可能不太正确......) 或者,您可以尝试使用JNA,这基本上是“痛苦较小的JNI”。 使用JNA,您可以编写Java类
public class EncryptUtilsJNA {
public static native void DoEncrypt(byte[] buffer, int length);
public static native void DoDencrypt(byte[] buffer, int length);
}
和JNA解决了如何调用DoEncrypt / DoDecrypt C函数,显然它们必须像使用JNI一样从Java调用。