2016-10-04 45 views
3

我想在我的Android項目中使用mbedtls。它使用CMake,方便,似乎最簡單的方法是保持原樣,然後添加一個包含JNI包裝的額外C文件。如何將JNI文件鏈接到外部Android C庫?

我已經下載了源./app/mbedtls並添加這./app/build.gradle

defaultConfig { 
    ... 
    externalNativeBuild { 
     cmake { 
      arguments "-DENABLE_TESTING=OFF" // Testing requires Perl which I don't have. 
     } 
    } 
} 
... 
externalNativeBuild { 
    cmake { 
     path "mbedtls/CMakeLists.txt" 
    } 
} 

這樣做的gradle這個構建成功完成(!有點令人驚訝的),儘管它實際上並不產生任何libx.a文件後。

我也創建了一個包含該文件./app/CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1) 
add_library(mbedtls_jni SHARED src/main/cpp/mbedtls_jni.cpp) 

而且我已經創建了一個文件。但是,我怎樣才能將它和mbedtls鏈接到一個庫中呢?理想情況下不需要修改mbedtls中的任何內容。

回答

0

試試這個:

  1. ./app/src/main/cpp/mbedtls

全部複製到mbedtls library files(*.c and *.h)夾mbedtls然後重命名所有的* .c爲*的.cpp

  • ./app/src/main/cpp/yourmain.cpp
  • 您的主程序(yourmain.cpp和yourmain.h)在cpp文件夾中。

  • ./app/CMakeLists.txt
  • cmake_minimum_required(VERSION 3.4.1) 
        option(USE_SHARED_MBEDTLS_LIBRARY "Build mbedtls TLS shared library." ON) 
    
        find_library(log-lib 
            log) 
    
        set(src_mbed 
         src/main/cpp/mbedtls/aes.cpp 
         src/main/cpp/mbedtls/aesni.cpp 
         src/main/cpp/mbedtls/arc4.cpp 
         src/main/cpp/mbedtls/asn1.cpp 
         src/main/cpp/mbedtls/asn1write.cpp 
         src/main/cpp/mbedtls/base64.cpp 
         src/main/cpp/mbedtls/bignum.cpp 
         src/main/cpp/mbedtls/blowfish.cpp 
         src/main/cpp/mbedtls/camellia.cpp 
         src/main/cpp/mbedtls/ccm.cpp 
         src/main/cpp/mbedtls/cipher.cpp 
         src/main/cpp/mbedtls/cipher_wrap.cpp 
         src/main/cpp/mbedtls/cmac.cpp 
         src/main/cpp/mbedtls/ctr_drbg.cpp 
         src/main/cpp/mbedtls/des.cpp 
         src/main/cpp/mbedtls/dhm.cpp 
         src/main/cpp/mbedtls/ecdh.cpp 
         src/main/cpp/mbedtls/ecdsa.cpp 
         src/main/cpp/mbedtls/ecjpake.cpp 
         src/main/cpp/mbedtls/ecp.cpp 
         src/main/cpp/mbedtls/ecp_curves.cpp 
         src/main/cpp/mbedtls/entropy.cpp 
         src/main/cpp/mbedtls/entropy_poll.cpp 
         src/main/cpp/mbedtls/error.cpp 
         src/main/cpp/mbedtls/gcm.cpp 
         src/main/cpp/mbedtls/havege.cpp 
         src/main/cpp/mbedtls/hmac_drbg.cpp 
         src/main/cpp/mbedtls/md.cpp 
         src/main/cpp/mbedtls/md2.cpp 
         src/main/cpp/mbedtls/md4.cpp 
         src/main/cpp/mbedtls/md5.cpp 
         src/main/cpp/mbedtls/md_wrap.cpp 
         src/main/cpp/mbedtls/memory_buffer_alloc.cpp 
         src/main/cpp/mbedtls/oid.cpp 
         src/main/cpp/mbedtls/padlock.cpp 
         src/main/cpp/mbedtls/pem.cpp 
         src/main/cpp/mbedtls/pk.cpp 
         src/main/cpp/mbedtls/pk_wrap.cpp 
         src/main/cpp/mbedtls/pkcs12.cpp 
         src/main/cpp/mbedtls/pkcs5.cpp 
         src/main/cpp/mbedtls/pkparse.cpp 
         src/main/cpp/mbedtls/pkwrite.cpp 
         src/main/cpp/mbedtls/platform.cpp 
         src/main/cpp/mbedtls/ripemd160.cpp 
         src/main/cpp/mbedtls/rsa.cpp 
         src/main/cpp/mbedtls/sha1.cpp 
         src/main/cpp/mbedtls/sha256.cpp 
         src/main/cpp/mbedtls/sha512.cpp 
         src/main/cpp/mbedtls/threading.cpp 
         src/main/cpp/mbedtls/timing.cpp 
         src/main/cpp/mbedtls/version.cpp 
         src/main/cpp/mbedtls/version_features.cpp 
         src/main/cpp/mbedtls/xtea.cpp 
         src/main/cpp/mbedtls/certs.cpp 
         src/main/cpp/mbedtls/pkcs11.cpp 
         src/main/cpp/mbedtls/x509.cpp 
         src/main/cpp/mbedtls/x509_create.cpp 
         src/main/cpp/mbedtls/x509_crl.cpp 
         src/main/cpp/mbedtls/x509_crt.cpp 
         src/main/cpp/mbedtls/x509_csr.cpp 
         src/main/cpp/mbedtls/x509write_crt.cpp 
         src/main/cpp/mbedtls/x509write_csr.cpp 
         src/main/cpp/mbedtls/debug.cpp 
         src/main/cpp/mbedtls/net_sockets.cpp 
         src/main/cpp/mbedtls/ssl_cache.cpp 
         src/main/cpp/mbedtls/ssl_ciphersuites.cpp 
         src/main/cpp/mbedtls/ssl_cli.cpp 
         src/main/cpp/mbedtls/ssl_cookie.cpp 
         src/main/cpp/mbedtls/ssl_srv.cpp 
         src/main/cpp/mbedtls/ssl_ticket.cpp 
         src/main/cpp/mbedtls/ssl_tls.cpp 
         src/main/cpp/yourmain.cpp 
         ) 
    
        add_library(yourmain SHARED ${src_mbed}) 
        set_target_properties(yourmain PROPERTIES VERSION 2.4.2 SOVERSION 0) 
        target_link_libraries(yourmain ${mbedtls} ${log-lib}) 
    
  • ./app/buid。 grandle
  • apply plugin: 'com.android.application' 
    
    android { 
        compileSdkVersion 26 
    
        buildToolsVersion "27.0.3" 
    
        defaultConfig { 
         applicationId "yourdomain.yourapp" 
         minSdkVersion 22 
         targetSdkVersion 26 
         versionCode 1 
         versionName "1.0" 
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    
         externalNativeBuild { 
          cmake { 
           cppFlags "-fexceptions" 
           cppFlags "-fvisibility=hidden" 
           cppFlags "-fvisibility-inlines-hidden" 
          } 
         } 
        } 
    
        externalNativeBuild { 
         cmake { 
          path "CMakeLists.txt" // this is required 
         } 
        } 
    
        buildTypes { 
         debug { 
          debuggable true 
          jniDebuggable true 
         } 
         release { 
          minifyEnabled false 
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
         } 
        } 
    
        productFlavors { 
        } 
    } 
    
    dependencies { 
        compile fileTree(include: ['*.jar'], dir: 'libs') 
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
         exclude group: 'com.android.support', module: 'support-annotations' 
        }) 
        compile 'com.android.support:appcompat-v7:26.0.0-alpha1' 
        compile 'com.android.support:design:26.0.0-alpha1' 
        compile 'com.android.support:cardview-v7:26.0.0-alpha1' 
        testCompile 'junit:junit:4.12' 
    }