如何在android ndk中生成assimp .so我正在使用assimp 3.0

问题描述 投票:0回答:1

我在 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 gradle android-ndk assimp
1个回答
0
投票

我在 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。

© www.soinside.com 2019 - 2024. All rights reserved.