首先我尝试使用Cipher Class,但由于性能原因我不得不放弃它。密码类产生大量实例并且GC崩溃。 另一种选择是使用NDK,所以我设法构建openssl-android。 现在使用libcrypto.so和libssl.so构建我不知道如何将它们与我的项目中的新.c文件链接起来,以便在Java端创建我需要的ecryption函数的包装器。
这是libcrypto.so的功能,我需要:
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, const int enc);
包装器将是这样的: Java方面:
public static native byte[] AESEncrypt(byte[] in, byte[] key, byte[] ivec, int enc);
本机包装器(带有共享库的.c文件端)
jbyteArray Java_com_myApp_Main_AESEncrypt(JNIEnv* env, jobject this, jbyteArray in, jbyteArray key, jbyteArray ivec, jint enc)
提前致谢,对不起,如果我的英语不是最好的。
答案 0 :(得分:1)
使用JavaCPP这样的接口.java文件可以解决这个问题:
@Platform(include="openssl/aes.h", link="crypto")
public class crypto {
static { Loader.load(); }
public static native void AES_cbc_encrypt(@Cast("unsigned char *") byte[] in,
@Cast("unsigned char *") byte[] out, @Cast("size_t") long length,
@Cast("const AES_KEY *") byte[] key, @Cast("unsigned char *") byte[] ivec, int enc);
}
我们可以将其包装到另一个静态方法中,以匹配您想要的API。