Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio CMake:创建一个共享android库,该库具有指向其共享库依赖项的正确路径_Android Studio_Cmake_Linker_Shared Libraries - Fatal编程技术网

Android studio CMake:创建一个共享android库,该库具有指向其共享库依赖项的正确路径

Android studio CMake:创建一个共享android库,该库具有指向其共享库依赖项的正确路径,android-studio,cmake,linker,shared-libraries,Android Studio,Cmake,Linker,Shared Libraries,我正在尝试创建一个本地(无Java代码)共享Android库,然后我可以在Unity游戏引擎中从C#创建DllImport。不幸的是,我的代码依赖于一个复杂的第三方共享库(libtensorflow.so),我不知道如何与它链接,以便它能够在部署后解析所需的符号 当Unity创建apk时,它将所有.so文件捆绑到同一个目录中(请参见Unity捆绑目录结构),加载libmy_库.so失败,因为它找不到。/../../../../src/main/jniLibs/armeabi-v7a/libten

我正在尝试创建一个本地(无Java代码)共享Android库,然后我可以在Unity游戏引擎中从C#创建
DllImport
。不幸的是,我的代码依赖于一个复杂的第三方共享库(
libtensorflow.so
),我不知道如何与它链接,以便它能够在部署后解析所需的符号

当Unity创建apk时,它将所有.so文件捆绑到同一个目录中(请参见Unity捆绑目录结构),加载
libmy_库.so
失败,因为它找不到
。/../../../../src/main/jniLibs/armeabi-v7a/libtensorflow.so
。该路径嵌入在共享库中(通过
ndk dependens
验证),我可能可以使用一些补丁程序来更改它,但我认为我缺少一个简单的
CMakeLists.txt
修改。可悲的是,我对CMake、Android Studio或共享库的工作原理了解得不够,无法弄清楚这一点

我试图
设置\u target\u属性的每次更改都会导致
忍者:错误:“../../../../../../../../build/intermediates/cmake/debug/obj/x86/libmy\u library.so”所需的“libtensorflow.so”,缺少并且没有已知的规则

目标链接库中省略libtensorflow将导致
app/src/main/cpp/native lib.cpp:8:错误:未定义对[…]的引用

我如何告诉CMake我链接的
将在哪里,同时让它找到它现在所在的位置


Unity捆绑目录结构:

├── ObjectIdentifier
│   ├── build.gradle
│   ├── libs
│   │   └── unity-classes.jar
│   ├── local.properties
│   ├── proguard-unity.txt
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets
│           ├── java
│           ├── jniLibs
│           │   ├── armeabi-v7a
│           │   │   ├── libmain.so
│           │   │   ├── libmono.so
│           │   │   ├── libmy_library.so
│           │   │   ├── libtensorflow.so
│           │   │   └── libunity.so
│           │   └── x86
│           │       ├── libmain.so
│           │       ├── libmono.so
│           │       ├── libmy_library.so
│           │       ├── libtensorflow.so
│           │       └── libunity.so
│           └── res

我的Android Studio项目层次结构:

├── MyLibrary.iml
├── app
│   ├── CMakeLists.txt
│   ├── app.iml
│   ├── build
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── cpp
│           │   ├── c_api.h
│           │   └── native-lib.cpp
│           └── jniLibs
│               ├── armeabi-v7a
│               │   └── libtensorflow.so
│               └── x86
│                   └── libtensorflow.so
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
             my_library
             # Sets the library as a shared library.
             SHARED
             # Provides a relative path to your source file(s).
             src/main/cpp/c_api.h
             src/main/cpp/native-lib.cpp )

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 )

set(ANDROID_SO_OUTDIR ${CMAKE_HOME_DIRECTORY}/../../../MyUnityProject/Assets/MyLibrary/Plugins/Android/libs)

add_library(tensorflow-lib SHARED IMPORTED)
set_target_properties(tensorflow-lib PROPERTIES IMPORTED_LOCATION
                      ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libtensorflow.so)

target_link_libraries(my_library

                       ${log-lib}
                       tensorflow-lib
                       )
#
# Copy the built library into the appropriate folder in MyUnityProject
#
add_custom_command(TARGET my_library POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E copy
   ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libmy_library.so
   ${ANDROID_SO_OUTDIR}/${ANDROID_ABI}/libmy_library.so)
app/build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 24
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-v -Wall"
            }
        }
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            // let gradle pack the shared library into apk
            jniLibs.srcDirs = ['../src/main/jniLibs']
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

我找到了一个解决方法,但它显然似乎绕过了CMake的使用方式:
target\u link\u库(我的库${log lib})-ltensorflow-L${CMake\u SOURCE\u DIR}/src/main/jniLibs/${ANDROID\u ABI}/”
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 24
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-v -Wall"
            }
        }
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            // let gradle pack the shared library into apk
            jniLibs.srcDirs = ['../src/main/jniLibs']
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}