--target native-lib不是目录

时间:2019-02-15 08:04:44

标签: android c++ cmake android-ndk java-native-interface

我在android项目中成功实现了本机支持,但是在更改项目路径(只需将项目放入子目录中)后,在构建应用程序时会出错。

"app/.externalNativeBuild/cmake/debug/x86 --target native-lib is not a directory" 

也无法清理和重建项目。项目正在运行中。项目路径中也没有空间。

感谢您的预先支持。

我正在使用Ubuntu 18.04,CMake 3.10.2,Android Studio 3.3

这是CMakeLists.txt(路径:appModule / 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} )

和应用程序build.gradele

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
    mavenCentral()
    google()
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId 'application_id'
        minSdkVersion 17
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        multiDexEnabled true
        externalNativeBuild {
      cmake {
          cppFlags "-std=c++11"
      }
        }
    }
    buildTypes {
        release {
      shrinkResources true
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
      debuggable true
      shrinkResources true
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
      path "CMakeLists.txt"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

1 个答案:

答案 0 :(得分:1)

如果您更改了应用程序-> appModule,则可以尝试

  • 从AS关闭项目
  • 使用AS重新打开
  • build>刷新链接的C ++项目(这将“强制” C ++构建方面进行清理)

Studio 3.3.0的a bug影响IDE行为,请使用版本3.3.1better

对于Gradle的CMake支持,应用程序可以三种方式使用它,从最明确的方式开始到“默认”:

香草CMake

假设香草CMake是从CMake.org本地下载的,配置Gradle为

  • local.properties中通知gradle cmake目录所在的位置,例如:cmake.dir=/your/vanilla/cmake/dir/like/linux-3.14.0
  • 将cmake版本传递到app/build.gradle文件中,例如
    android {
        externalNativeBuild {
            version “3.14.0-rc2”
            path ‘....’  // point to your CMakeLists.txt, relative path to
                         // THIS app/build.gradle file.
        }
    }

Vanilla CMake的缺点可能是SDK内的模块(例如AndroidNdkModules.cmake)可能不在您的模块路径中:该项目未使用内部装有SDK / Studio的CMake。

明确获取SDK的CMake

到目前为止,SDK附带2个cmake版本:3.6.0-rc2和3.10.2。您的sdk管理员会将其下载到内部已知目录(sdk / cmake)中。项目可以选择一个特定的项目来使用。当然,您可以使用上面的“ Vanilla CMake”方法,即,应用程序配置了所有内容–将cmake.dir指向$ SDK的cmake路径(一直到但不包括'bin / cmake')。 /> 您也可以忽略cmake.dir配置(Studio提供了此便利,因为它位于sdk中,并由sdk管理器下载),因此您只需要在'app / build.gradle'中配置cmake版本

    android {
        externalNativeBuild {
            version “3.10.2”
            path ‘....’
        }
    }

关于gradle插件功能,两个cmake版本之间没有什么区别,区别在于两个版本之间cmake本身的功能内部。

使用默认值:让Studio决定cmake版本

当前gradle插件的默认cmake选择是内部3.6.0-rc2版本。因此,如果您未配置“ cmake.dir”和“版本”,则默认为有效。您当然仍然可以使用“ Vanilla CMake”方式进行配置:cmake路径和版本;它有点令人恐惧,但有一个较小的好处:当Studio / Gradle将cmake默认值更改为3.10.2或其他值时,您的应用不会受到影响。我们鼓励应用程序使用最新版本。作为应用程序开发人员,无论构建工具的版本如何,我都可能希望我的应用程序具有固定的行为。从这种意义上讲,显式方式会有所帮助。

附加说明

  • CMake版本:您将运行'cmake --version'以获取正确的版本号以配置build.grale, sdk的cmake目录。
  • 您的顶级CMakeLists.txt位置:对gradle插件无动于衷。实际上,您可能将其与C ++代码放在一起,因此当您与其他平台共享时,它们(c ++构建脚本和源代码)位于一个目录中。