2

首先我尝试使用Cipher Class,但由于性能问题我不得不放弃它。Cipher Class 产生大量实例,GC 崩溃。另一种选择是使用 NDK,所以我设法构建了openssl-android。现在使用 libcrypto.so 和 libssl.so 构建,我不知道如何将它们与我的项目中的新 .c 文件链接,以制作我在 Java 端需要的加密函数的包装器。

这是 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)

提前谢谢,如果我的英语不是最好的,对不起。

4

1 回答 1

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。

于 2013-02-06T00:05:30.877 回答