美文网首页
Android assimp编译及引用

Android assimp编译及引用

作者: 挨踢亮 | 来源:发表于2018-11-08 20:14 被阅读0次

    前言


    Assimp一个解析3D模型的库,能解析40多种模型格式.该开源库到目前为止一直是在维护更新的。
    本文将介绍如何编译Android所需的so库以及通过cmake的方式将库引用到项目当中去
    assimp的官方地址:http://www.assimp.org/
    assimp的api地址:http://assimp.sourceforge.net/lib_html/annotated.html
    assimp的编译参考文章:https://blog.csdn.net/camellhf/article/details/78065622
    assimp的源码及编译脚和编译好的assimp.so存放百度网盘位置:/资源文件/assimp.rar

    步骤


    一.环境
    Window 7
    Android NDK With Android API >9 Support
    Python
    二.Android Studio配置
    1.该配置是参考上面的文章,让Android Studio自己去下载配置,也可以配置自己的环境里面的Cmake和NDK


    2.记住自己的ndk位置就可以开始编译,对下图进行解释就知道怎么编译了。


    capture.PNG

    文件及文件夹解释:
    编译armeabi-v7a
    1.make_standalone_toolchain-arm32.bat该文件生成编辑的toolchain

    python E:/a_liang/android-ndk-r14b/build/tools/make_standalone_toolchain.py --arch=arm --api=24 --install-dir=android-toolchain-24-llvm-armeabi-v7a
    pause
    

    参数解释:

    1. E:/a_liang/android-ndk-r14b/build/tools/make_standalone_toolchain.py
      是我的ndk对应make_standalone_toolchain.py的路径
    • --arch=arm 编译的架构,我要编译armeabi-v7a所以选的是arm
    • --api=24 Android Api版本
    • --install-dir=android-toolchain-24-llvm-armeabi-v7a 将生成的文件存放的路径

    2.android-toolchain-24-llvm-armeabi-v7a
    就是上一步执行make_standalone_toolchain-arm32.bat生成的编译工具链

    3.build_assimp -arm32.bat
    具体执行Cmake命令的小脚本

    @echo off cls
    REM *NOTE* Change these based on 
    SET ASSIMP_DIR=assimp-1030
    SET OUTPUT_DIR=assimp-build-armeabi-v7a
    SET ANDROID_PATH=D:\android\android-sdk
    SET NDK_PATH=E:\a_liang\ProjectSets\android-ndk-r14b
    SET NDK_TOOLCHAIN=%~dp0android-toolchain-24-llvm-armeabi-v7a 
    SET CMAKE_TOOLCHAIN=%NDK_PATH%\build\cmake\android.toolchain.cmake
    SET CMAKE_PATH=%ANDROID_PATH%\cmake\3.6.4111459
    REM *NOTE* Careful if you don't want rm -rf, I use it for testing purposes.
    rm -rf %OUTPUT_DIR%
    mkdir %OUTPUT_DIR%
    
    REM pushd doesn't seem to work ):< 
    cd %OUTPUT_DIR%
    if not defined ORIGPATH set ORIGPATH=%PATH%
    SET PATH=%CMAKE_PATH%\bin;%ANDROID_PATH%\tools;%ANDROID_PATH%\platform-tools;%ORIGPATH%
    cmake.exe ^
            -GNinja ^
            -DCMAKE_TOOLCHAIN_FILE=%CMAKE_TOOLCHAIN% ^
            -DASSIMP_ANDROID_JNIIOSYSTEM=ON ^
            -DANDROID_NDK=%NDK_PATH% ^
            -DCMAKE_MAKE_PROGRAM=%CMAKE_PATH%\bin\ninja.exe ^
            -DCMAKE_BUILD_TYPE=Release ^
            -DANDROID_ABI="armeabi-v7a" ^
            -DANDROID_NATIVE_API_LEVEL=24 ^
            -DANDROID_FORCE_ARM_BUILD=TRUE ^
            -DCMAKE_INSTALL_PREFIX=install ^
            -DANDROID_STL=c++_static ^
            -DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing ^
            -DANDROID_TOOLCHAIN=clang ^
            -DASSIMP_BUILD_TESTS=OFF ^
            ../%ASSIMP_DIR%
    cmake.exe --build .
    cd ..
    pause
    

    部分参数解释"

    • SET NDK_TOOLCHAIN=%~dp0android-toolchain-24-llvm-armeabi-v7a
      上一步生成的cmake编译工具链的地址
    • -DANDROID_STL=c++_static
      这玩意参数错误了,将assimp引入到工程里面问题很烦人
    • 其它参数看名字应该都知道的
      点击build_assimp -arm32.bat会生成assimp-build-armeabi-v7a

    4.assimp-build-armeabi-v7a

    • code文件夹里面就存放的对应架构的libassimp.so

    三.CMake方式引入libassimp.so


    1.如果再项目model下面没有CMakeLists.txt文件则先创建一个CMakeLists.txt文件

    cmake_minimum_required(VERSION 3.4.1)
    
    
    set(CMAKE_VERBOSE_MAKEFILE on)
    #set(assimpDir /src/main/cpp/externals/assimp)
    #set(assimpInclude ${assimpDir}/include/assimp)
    #include_directories(${assimpInclude})
    #该include的作用是添加assimp提供的头文件给引入进来
    include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/externals/assimp/include/assimp)
    
    #该add_library说明最后生成jni的so的名字
    add_library(
            # Sets the name of the library.
            assimp-jni
            # Sets the library as a shared library.
            SHARED
            # Provides a relative path to your source file(s).
            src/main/jni/cmakejnitestactivity.cpp)
    #add_library和set_tartget_properties结合起来是将我们刚才编译出来的libassimp.so给引用进来
    add_library(libassimp-shared SHARED IMPORTED)
    set_target_properties(
            libassimp-shared
    
            PROPERTIES
            IMPORTED_LOCATION
    
            ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libassimp.so
    )
    #
    #find_library(
    #        EGL-lib
    #
    #        EGL
    #)
    #find_library(
    #        GLESv2-lib
    #
    #        GLESv2
    #)
    #find_library(
    #        stdc++-lib
    #
    #        stdc++
    #)
    find_library(android-lib android)
    find_library(log-lib log)
    

    2.在项目model的build.gradle添加cmake的一些配置

    defaultConfig里面添加
    externalNativeBuild {
        cmake {
            cppFlags "-std=c++11", "-frtti", "-fexceptions"
            abiFilters 'armeabi-v7a', 'arm64-v8a'        
        }
    }
    和buildTypes同级的目录下添加
    externalNativeBuild {
        cmake {
            path file('CMakeLists.txt')
        }
    }
    

    3.需要将assimp的头文件引入.
    从CMakeLists.txt文件可以知道我将assimp头文件放在cpp文件里面的
    include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/externals/assimp/include/assimp)
    assimp的头文件是在下载源码的include文件夹里面,拷贝到项目当中就可以了

    这三部就把assimp引入到项目当中去了,其实过程挺简单的。

    四. 错误

    我在编译assimp的时候没有出过错误,但是将编译好libassimp.so要引入到Android 工程里的时候有个错很烦

    提示:libc++_shared.so not found

    最后是将编译文件build_assimp -arm32.bat有个参数改了后重新编译在引入就没有问题了.
    -DANDROID_STL=c++_shared
    改为
    -DANDROID_STL=c++_static
    就可以了

    相关文章

      网友评论

          本文标题:Android assimp编译及引用

          本文链接:https://www.haomeiwen.com/subject/ctcgxqtx.html