如何将JNI文件链接到外部Android C库?

3
我将尝试在我的安卓项目中使用 mbedtls。它使用CMake,这很方便,似乎最简单的方法是保持原样,并添加一个包含JNI包装器的额外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中的任何内容。

1个回答

0

请尝试以下操作:

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

将所有mbedtls库文件(*.c和*.h)复制到mbedtls文件夹中,然后将所有*.c重命名为*.cpp

  1. ./app/src/main/cpp/yourmain.cpp

您的主程序(yourmain.cpp和yourmain.h)在cpp文件夹中。

  1. ./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/build.gradle
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'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接