web-dev-qa-db-ja.com

Android 3.6からStudio 4.0にアップデートした後、NDKサポートを使用してプロジェクトをビルドするとエラー

Android Studioから4.0プロジェクトへの更新後、ビルドはエラーで終了します

OSに依存しないパス「lib/armeabi-v7a/libdlib.so」で複数のファイルが見つかりました。 jniLibsおよびCMake IMPORTEDターゲットを使用している場合は、 https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake を参照してください。

リンクはAndroid Studio Previewの新機能4.1であるページにリンクしています

[〜#〜] edit [〜#〜]実際、Googleキャッシュでリンクされている情報を見つけることができます: ビルド済みの依存関係の自動パッケージングCMakeによって使用されます そこに述べられていることは:

Android Gradle Pluginの以前のバージョンでは、jniLibsを使用して、CMake外部ネイティブビルドで使用されるビルド済みライブラリを明示的にパッケージ化する必要がありました。Android Gradle Plugin 4.0、上記の構成は不要になり、ビルドが失敗します。

しかし、それは私には当てはまりません

こちらがbuild.gradle

apply plugin: 'com.Android.library'
apply plugin: 'kotlin-Android'
Android {
compileSdkVersion 29
buildToolsVersion "29.0.2"


defaultConfig {
    minSdkVersion 21
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"

    externalNativeBuild {
        cmake {
            cFlags "-O3"
            cppFlags "-std=c++11 -frtti -fexceptions -mfpu=neon"
            arguments "-DANDROID_PLATFORM=Android-16",
                    "-DANDROID_TOOLCHAIN=clang",
                    "-DANDROID_STL=c++_shared",
                    "-DANDROID_ARM_NEON=TRUE",
                    "-DANDROID_CPP_FEATURES=rtti exceptions"
        }
    }
}

buildTypes {
    debug {}
    stage {
        debuggable true
        minifyEnabled false
    }

    release {
        minifyEnabled false
    }
}

kotlinOptions {
    jvmTarget = "1.8"
}

externalNativeBuild {
    cmake {
        path "src/main/cpp/CMakeLists.txt"
        version "3.10.2"
    }
}

packagingOptions {
    pickFirst "**/libc++_shared.so"
    pickFirst "**/libdlib.so"
}

}

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])

   implementation 'androidx.annotation:annotation:1.1.0'
   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

およびCMakeLists.txt

set(LIB_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)

#
cmake_minimum_required(VERSION 3.4.1)

add_library(dlib SHARED IMPORTED)

# sets the location of the prebuilt dlib .so
set_target_properties( dlib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../jniLibs/${Android_ABI}/libdlib.so )

# ------------------------------------------------------------------

add_library( # Sets the name of the library.
        face-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        face-lib.cpp)

target_include_directories(
        face-lib PRIVATE
        ${CMAKE_SOURCE_DIR}/include
)

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)


target_link_libraries( # Specifies the target library.
        face-lib

        dlib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
9

OK、それで私は解決策を見つけました、私はこれを私のネイティブライブラリでモジュールに追加しました:

 packagingOptions {
        pickFirst "**/libdlib.so"
    }

根本的な原因ではなく結果を修正するので、私はそれが好きではありません。誰かがより良い解決策を持っている場合は、ここに投稿してください。

3

私も同じ問題に直面しました。

それが私のgradleファイルが書かれた方法です:

    sourceSets {
        main {
            jniLibs.srcDirs 'src/main/cpp/libs'
        }
    }

実際には、フォルダーに2つの.soファイルがあり、リンクsee https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmakeは情報を表示しているようですAndrioid Stuidoがライブラリを自動的にパッケージ化することを意味します

だから私はdeleteこのコンテンツを私のgradleファイルの中に入れれば、すべてうまくいきます。

1
Joshua

私の側では、フォルダーの名前としてのjniLibsが誤ってエラーをトリガーしていたようです。ファイルシステムのパスとcmakelists.txtの両方でフォルダーの名前を別の名前(「ライブラリ」を使用)に変更すると、問題が解決しました。

cmakelists.txtフラグメント

# import library and set path
add_library(ixxs-plugin SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(ixxs-plugin PROPERTIES
        IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../libraries/${CMAKE_Android_Arch_ABI}/libixxs-plugin.so"
        )

gradleファイルでは何もする必要はありません。自動的にlibsが検出され、aarファイルに入れられます。あなたはそれをチェックするためにaarファイルを解凍することができます。 (ライブラリは{nameofaar}/jni/{Arch_type}/{nameoflib} .soにあります)

1
AndrewBloom