java - 为 Android 的 libcrypto.so 函数制作 JNI 包装器

标签 java android android-ndk java-native-interface wrapper

首先我尝试使用 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);

native 包装器(带有共享库的 .c 文件端)

jbyteArray Java_com_myApp_Main_AESEncrypt(JNIEnv* env, jobject this, jbyteArray in, jbyteArray key, jbyteArray ivec, jint enc)

提前致谢,如果我的英语不是最好的,抱歉。

最佳答案

JavaCPP像这样的接口(interface) .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。

关于java - 为 Android 的 libcrypto.so 函数制作 JNI 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716580/

相关文章:

android - 使用 GSON(序列化/反序列化库)时,我是否需要为模型类实现可序列化

Android.mk 似乎忽略了 LOCAL_C_INCLUDES 并且找不到 GLES2 包含

java - 解析 .java 文件以提取所有特征

android - 暗淡的背景,就像显示对话框时一样

java - 监听/处理 JPanel 事件

android - 为什么绘制我的 OpenGL-ES VBO 网格会阻止显示其他三角形?

android - jmethodID 的 NewGlobalRef

android - "Logged in"回调从未在 Android 上被 libspotify 调用

java - 对于这样的输入,简单但有效的括号检查器?

java - 有没有办法在Java(Android)中将 boolean 数组打印为(0,1)