如何在Android Studio中包含带有CMake和Gradle的C ++ AAR库

时间:2019-01-04 16:52:36

标签: android android-studio cmake android-ndk android-gradle

我希望将yctung's AndroidLibSVM包含到我的项目中,因此我按照他的指示导入了.AAR并设置了依赖项。

  

安装

     

安装很容易,只需按照以下步骤将我们的AAR库导入到Android项目中即可:

     

右键单击您的模块->新建->模块->导入.JAR / .AAR包->>选择我们的Release / androidlibsvm-release.aar

     

此后,您应该通过以下方式添加应用依赖项:

     

右键单击您的应用程序模块->打开模块设置-> clieck您的应用程序->>依赖关系-> +->模块依赖关系-> androidlibsvm

现在,我可以按预期的方式导入和使用他的库,Android Studio可以编译代码并进行构建,而不会出现任何错误。该应用在模拟设备上可以正常运行,但是,一旦尝试运行引用yctung库的部分代码,它就会在我的物理设备上崩溃,并出现以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memcpy" referenced by "/data/app/com.krautkremer.nils.mymirror-1/lib/arm/libjnilibsvm.so"

请参阅this SO问题,该错误可能是由不正确的Cmake / Gradle设置引起的。如果我做对了,当我在使用Cmake进行构建时,董先生将ndk-build用于他的项目。因此,就我而言,他关于如何安装库的说明可能还不够。实际上,我没有对默认的CMakeLists.txt进行任何更改,这对Cmake至关重要。 我试图在build.gradle和/或CmakeLists文件中添加几行,因为它们在SO解决方案中通常被建议没有成功,但是我不得不承认,即使在之后,我真的不明白我在做什么阅读官方的guide。 我有点迷失在这里,因为我几乎不知道ndk-build和Cmake之间的区别,更不用说如何正确设置它们了,或者在这种情况下甚至是必要的。 如果有人可以向我解释,我如何将AndroidLibSVM正确集成到我的项目中,我对gradle / cmake文件必须进行哪些更改以及如何设置目录(以防{{3 }}是答案的一部分)。 到目前为止,我下载的只是.aar,它确实包含一些.so文件,但我不知道将它们放在哪里。

现在, 这是我的build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 28


defaultConfig {
    applicationId "com.krautkremer.nils.mymirror"
    minSdkVersion 23
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    externalNativeBuild {
        cmake {
            cppFlags ""
            arguments "-DANDROID_PLATFORM=android-23"
        }
    }

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
packagingOptions {
    //exclude 'META-INF/proguard/androidx-annotations.pro'
}

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"


    }
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
implementation 'androidx.media:media:1.1.0-alpha01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
implementation 'com.google.android.material:material:1.1.0-alpha01'
implementation 'androidx.annotation:annotation:1.0.1'
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.google.firebase:firebase-ml-vision:18.0.2'
implementation 'com.google.firebase:firebase-ml-common:16.1.6'
implementation 'com.google.firebase:firebase-ml-vision-face-model:17.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1-alpha01'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1-alpha01'
implementation project(':androidlibsvm-release')
}
apply plugin: 'com.google.gms.google-services'

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)


add_library( 
    native-lib

    SHARED

    src/main/cpp/native-lib.cpp)


find_library( 
    log-lib
    log)

target_link_libraries( 
    native-lib

    ${log-lib})

this是我的目录结构。

先谢谢您。如果您需要更多帮助我,我很乐意帮助您帮助我;)

0 个答案:

没有答案