2013-02-05 18 views
2

首先,我嘗試使用Cipher Class,但由於性能,我必須放棄它。密碼類產生大量實例和GC崩潰。 另一種選擇是使用NDK,所以我設法建立了openssl-android。 現在與libcrypto.so和libssl.so建立我不知道如何將它們與我的項目中的一個新的.c文件鏈接,以使我需要在Java端的ecryption函數的包裝。爲Android的libcrypto.so函數製作JNI包裝器

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

在此先感謝,抱歉如果我的英文不是 最好。

回答

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。

+0

感謝您的快速回復,我會閱讀並嘗試JavaCPP,看看會發生什麼 – maxiruani

+0

鏈接到JavaCPP存儲庫轉移到github:https://github.com/bytedeco/javacpp –

+0

@ maxiruani,它的工作?你有任何JNI包裝工作樣本? – Sharath