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

时间:2015-08-08 13:47:58

标签: android c++ android-studio openssl java-native-interface

一开始,我不得不说我已经尽可能多地搜索了答案。其中一些非常有用,但不是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>
    
  2. 并且#include显示未使用的导入语句的警告,但我确实使用了它。当我构建时,我收到如下错误消息:

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

    结果,我怀疑我没有使我的openssl库正确,但我确实在build.gradle中指定了它。我在这方面做了很多努力,没有运气。任何线索或想法将不胜感激!!!!

1 个答案:

答案 0 :(得分:1)

最后我找到了这个的根本原因。我得到的错误消息如下:

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

是因为我的libcrypto.a和libssl.a库不是为基于android-armv7的设备构建的。我通过&#34;交叉编译&#34;解决了这个问题。我对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编译的。如果你们还遇到类似的问题,请随时问我!