我正在尝试创建一个本机(无Java代码)共享的Android库,然后可以从Unity游戏引擎中的C#DllImport
进行创建。不幸的是,我的代码依赖于复杂的第三方共享库(libtensorflow.so
),我无法弄清楚如何对其进行链接,以便它可以在部署后解析所需的符号。
Unity创建apk时,会将所有.so文件捆绑到同一目录中(请参见 Unity捆绑目录结构),并且由于找不到{{ 1}}。此路径已嵌入共享库中(已通过libmy_library.so
验证),我也许可以使用一些修补程序来更改它,但是我认为我缺少一个简单的../../../../src/main/jniLibs/armeabi-v7a/libtensorflow.so
修改。可悲的是,我对CMake,Android Studio或共享库的工作方式了解不足,无法弄清楚。
我尝试ndk-depends
进行的每次更改都会导致CMakeLists.txt
。
从set_target_properties
省略libtensorflow将导致ninja: error: 'libtensorflow.so', needed by '../../../../build/intermediates/cmake/debug/obj/x86/libmy_library.so', missing and no known rule to make it
。
我如何告诉CMake我要链接的target_link_libraries
在哪里,而让它找到现在的位置?
app/src/main/cpp/native-lib.cpp:8: error: undefined reference to [...]
统一捆绑的目录结构:
.so
我的Android Studio项目层次结构:
$ndk-depends --print-direct libmy_library.so
liblog.so
../../../../src/main/jniLibs/armeabi-v7a/libtensorflow.so
libm.so
libstdc++.so
libdl.so
libc.so
CMakeLists.txt:
├── 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
app / build.gradle
├── 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