如何以纯 Android Studio 方式编译我的 C++ 库(无需自行指定任何 .mk 文件)

How to compile my C++ library in pure Android Studio way (without specifying any .mk file on our own)

一开始,我不得不说我已经搜索了尽可能多的可能答案。其中一些确实很有帮助,但不是 Android Studio 的方式。另外,我可以让我的 JNI 与众所周知的示例“getStringFromNative()”一起工作,所以请不要给我这种链接。到目前为止我尝试了什么:

1.我的目录结构

app 
 |- src
     |- main
         |- java
         |- jni
             |- libs
                 |- libcrypto.a
                 |- libssl.a
             |- openssl
                 |- xxxxx.h
                 |...... -> those .h file of openssl
             |- com_ais_ndksample_MainActivity.h
             |- CipherModule.cpp
             |- CipherModule.h

2。 build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0 rc3"

    defaultConfig {
        applicationId "com.ais.ndksample"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        ndk {

            moduleName "JniDemo"

        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-  android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {

          jni.srcDirs = ['src/main/jni']

          jniLibs.srcDirs = ['src/main/jni/libs']

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'

}
  1. 错误发生在我的CipherModule.cpp,我在上面有几条语句如下:

    #include "CipherModule.h"
    #include <openssl/aes.h>
    #include <stdio.h>
    #include <iostream>
    

并且 #include 显示 未使用的导入语句 的警告,但我确实使用了它。当我构建时,我收到如下所示的错误消息:

undefined reference to `AES_set_encrypt_key`
undefined reference to `AES_cbc_encrypt`

因此,我怀疑我的openssl库没有做对,但我确实在我的build.gradle中指定了它。我为此付出了很多努力,但没有运气。任何线索或想法将不胜感激!!!!

终于找到了根本原因。我得到的错误信息如下:

undefined reference to `AES_set_encrypt_key`
undefined reference to `AES_cbc_encrypt`

是因为我的 libcrypto.a 和 libssl.a 库不是为基于 android-armv7 的设备构建的。我通过 "cross-compile" 我的 armv7 openssl 解决了这个问题。脚本如下:

export CC=/your_path_to_sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc

export AR=/your_path_to_sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar

export RANLIB=/your_path_to_sdk/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc-ranlib

./Configure android-armv7

export ANDROID_DEV=/your_path_to_sdk/ndk-bundle/platforms/android-15/arch-arm/usr

make

您可以 运行 从 official website 下载的 openssl 文件夹中的此脚本,您将在 openssl 文件夹中获得 libcrypto.a 和 libssl.a。这次是为 android 编译的。如果大家还遇到类似的问题,欢迎来问我!