我在 android studio 2.2.1 中遇到这个错误 错误:预构建共享库“my_assimp:armeabi-”的共享库链接文件 E:\path dmodelndk\AssimpAndroid-master pp\src\main xternals ssimp-3.0\libs rmeabi-v7a\libassimp.so 不存在v7a调试共享'
构建.gradle:
// Assimp prebuilt shared lib
my_assimp {
// Inform Android Studio where header file dir for this lib
headers.srcDir "src/main/externals/assimp-3.0/include"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/externals/assimp-3.0/libs/" +
"${targetPlatform.getName()}/libassimp.so")
}
}
buildForAndroid.sh:
//!/bin/sh
//Path to Android NDK
export ANDROID_NDK=$Android_NDK
//Points to the Android SDK
export ANDROID_SDK=$Android_SDK
export PATH=$PATH:$ANDROID_SDK/tools
export PATH=$PATH:$ANDROID_SDK/platform-tools
export PATH=$PATH:$ANDROID_SDK/tools/bin
//from https://github.com/taka-no-me/android-cmake
export ANDROID_STANDALONE_TOOLCHAIN=$ANDROID_SDK/cmake/3.6.3155560 /android.toolchain.cmake
//Add additional args here as appropriate
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_STANDALONE_TOOLCHAIN \
-DANDROID_NDK=$ANDROID_NDK \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="x86" \
-DANDROID_NATIVE_API_LEVEL=android-9 \
-DANDROID_FORCE_ARM_BUILD=TRUE \
-DCMAKE_INSTALL_PREFIX=install \
..
//This is to remove the versioned shared libs in assimp.
sed -i s/-soname,libassimp.so.3/-soname,libassimp.so/g code/CMakeFiles/assimp.dir/link.txt
//make -j4
我在 Android Studio (C++) 中使用带有 AGDK 的 assimp 最新版本,我用来生成 .so 文件的方法是使用 ninja 生成。 Ninja 是一个注重速度的小型构建系统,通常与 CMake 一起使用。您可以通过 Ninja 的 GitHub 页面或包管理器安装它。
创建一个将生成构建文件的新目录。这可以保持你的源目录干净。
mkdir build
cd build
现在您将使用 CMake 配置 Android 的构建系统。 Android NDK 提供了您需要指定的特定 CMake 工具链文件。该工具链有助于为 Android 构建设置正确的环境。
cmake -DCMAKE_TOOLCHAIN_FILE=C:\Users\<user>\AppData\Local\Android\Sdk\ndk\<version>\build\cmake\android.toolchain.cmake \
-DANDROID_NDK=C:\Users\<user>\AppData\Local\Android\Sdk\ndk\<version> \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="armeabi-v7a with NEON" \
-G Ninja \
..
CMAKE_TOOLCHAIN_FILE:指向Android NDK CMake工具链文件,用于设置交叉编译环境。
ANDROID_NDK:Android NDK 的位置。
CMAKE_BUILD_TYPE:使用Release构建库的优化版本。
ANDROID_ABI:指定Android的目标架构。在这里,我们使用 armeabi-v7a 和 NEON。
G Ninja:使用Ninja构建系统进行快速编译。 确保路径正确并指向正确的 NDK 位置。
最后我们构建项目
cmake --build .
要导入 assimp,CMakeList.txt 应该如下所示
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
cmake_minimum_required(VERSION 3.22.1)
project("project-name")
# Creates your game shared library. The name must be the same as the
# one used for loading in your Kotlin/Java or AndroidManifest.txt files.
add_library(project-name SHARED
main.cpp
)
add_definitions(-DAI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
#libassimp
set(ASSIMP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/assimp/include")
set(ASSIMP_LIB_PATH "${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libassimp.so")
include_directories(${ASSIMP_INCLUDE_DIR})
add_library(assimp SHARED IMPORTED)
set_target_properties(assimp
PROPERTIES
IMPORTED_LOCATION ${ASSIMP_LIB_PATH}
INTERFACE_INCLUDE_DIRECTORIES ${ASSIMP_INCLUDE_DIR}
)
# Searches for a package provided by the game activity dependency
find_package(game-activity REQUIRED CONFIG)
# Configure libraries CMake uses to link your target library.
target_link_libraries(project-name
# The game activity
game-activity::game-activity
EGL
GLESv3
jnigraphics
android
log
# Assimp library
assimp)
注意: Assimp 文件夹必须位于 cpp 文件夹中
app/src/main/cpp
并且您应该在目录中创建一个名为 jniLibds 的文件夹 app/src/main
并修改您的构建 gradle 以添加以下内容:
android {
...
sourceSets {
getByName("main") {
jniLibs.srcDirs()
}
}
...
ndk {
abiFilters += listOf("x86_64", "arm64-v8a") // Specify your target ABI
}
}
在 jniLibs 中,您应该创建一个与指定的 ABI 名称相同的文件夹,并将您的 .so 文件放入其中,该文件是在构建 assimp 时使用指定的 ABI 构建的。
剩下要做的就是在 Android Studio 中构建 CMakeList.txt 并导入 assimp。