Android studio CMake:创建一个共享android库,该库具有指向其共享库依赖项的正确路径
我正在尝试创建一个本地(无Java代码)共享Android库,然后我可以在Unity游戏引擎中从C#创建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
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'
}