Windows下编译Assimp库供Android使用

Windows下编译Android使用的Assimp库

.bat脚本

rem 关闭回显
@echo off
rem 清除屏幕
cls
::==========================================================================
::本脚本用来在Windows环境使用Cmake交叉编译Android使用的assimp-5.0.1库
::==========================================================================

title cmake build assimp-5.0.1

chcp 65001>nul

echo.
echo.
echo.--------本脚本用来用来在Windows环境使用Cmake交叉编译Android使用的库------
echo.

echo CMD Path:%cd%
echo 当前 dir:%~dp0

rem 切换到当前目录
cd /d %~dp0

:: --------------------------------------------------------------------------
rem 临时变量
set ANDROID_NDK=D:/Compiler/Android/ndk/21.4.7075529
set CMAKE_PATH=D:/Compiler/Android/cmake/3.10.2.4988404
set ANDROID_VERSION=21
set SOURCE_DIR=./assimp-5.0.1
set NATIVE_BUILD_DIR=.
set INSTALL_DIR=%~dp0

set ANDROID_ARMV5_CFLAGS="-march=armv5te"
rem -mfpu=vfpv3-d16  -fexceptions -frtti
set ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mfpu=neon"
rem -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti
set ANDROID_ARMV8_CFLAGS="-march=armv8-a"   
set ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
set ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"

:: --------------------------------------------------------------------------
echo.
echo.--------------------------开始build--------------------------------------
echo.

rem call:label表示调用用":"标识,以goto:eof结束的函数代码段

rem --make armeabi
@REM call:buildAssimp armeabi %ANDROID_ARMV5_CFLAGS%

rem --make armeabi-v7a
call:buildAssimp armeabi-v7a %ANDROID_ARMV7_CFLAGS%

rem --make arm64-v8a
call:buildAssimp arm64-v8a %ANDROID_ARMV8_CFLAGS%

rem --make x86
call:buildAssimp x86 %ANDROID_X86_CFLAGS%

rem --make x86_64
call:buildAssimp x86_64 %ANDROID_X86_64_CFLAGS%

set timeout=5
echo.倒计时 %timeout% 秒钟后自动退出
for /L %%a in (%timeout% -1 1) do ( ^
    set /p=%%a . <nul&ping -n 2 127.0.0.1>nul
)

echo.
echo.&pause&goto:eof

:: --------------------------------------------------------------------------
rem 定义函数 (%1:arch_abi,%2:cflags)
:buildAssimp
setlocal

    echo.[func]-----------------start make [%1]---------------------------
    echo.
    
    ::注意这里我们使用  %~1 引用参数是为了脱去变量赋值时的 边界 双引号""
    set ABI=%~1
    set CFLAGS=%~2
    set BINARY_DIR="%NATIVE_BUILD_DIR%/bin/%ABI%"
    set PLATFORM_VERSION=%ANDROID_VERSION%
    set LIB_OUTPUT_DIR="%INSTALL_DIR%/dist/%ABI%"
    
    rem 批处理中if else 需在一行,() 括号内容表示在"("开始的同一行
    if %ABI%==armeabi (
        echo.[func]----当前编译--^>armeabi
        goto pass
    )
    if %ABI%==armeabi-v7a (
        echo.[func]----当前编译--^>armeabi-v7a
        goto pass
    )
    if %ABI%==arm64-v8a (
        echo.[func]----当前编译--^>arm64-v8a
        goto pass
    )
    if %ABI%==x86 (
        echo.[func]----当前编译--^>x86
        goto pass
    )
    if %ABI%==x86_64 (
        echo.[func]----当前编译--^>x86_64
        goto pass
    ) else (
        echo.[ERROR]----不支持的ABI---^>%ABI%
        pause>nul
        exit
    )
    
    :pass
    
    echo [func]----PLATFORM_VERSION==%ANDROID_VERSION%
    echo [func]----ABI==%ABI%
    echo [func]----CFLAGS==%CFLAGS%
    echo [func]----SOURCE_DIR==%SOURCE_DIR%
    echo [func]----BINARY_DIR==%BINARY_DIR%
    echo [func]----LIB_OUTPUT_DIR==%LIB_OUTPUT_DIR%
    echo.
    echo.
    
    if not exist %BINARY_DIR% md %BINARY_DIR%
    
    cd /d %BINARY_DIR%
    
    :: -G"MinGW Makefiles"
    :: -DCMAKE_MAKE_PROGRAM=%ANDROID_NDK%/prebuilt/windows-x86_64/bin/make.exe
    
    rem 开源库有提供cmake         Android Gradle - Ninja ^ 
    %CMAKE_PATH%/bin/cmake ^
        -DANDROID_ABI=%ABI% ^
        -DANDROID_PLATFORM=android-%PLATFORM_VERSION% ^
        -DCMAKE_INSTALL_PREFIX=%LIB_OUTPUT_DIR% ^
        -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR%/build ^
        -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR%/build ^
        -DCMAKE_BUILD_TYPE=Release ^
        -DANDROID_NDK=%ANDROID_NDK% ^
        -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%/build/cmake/android.toolchain.cmake ^
        -DCMAKE_MAKE_PROGRAM=%CMAKE_PATH%/bin/ninja.exe ^
        -G"Ninja" ^
        -DANDROID_ARM_NEON=TRUE ^
        -DANDROID_TOOLCHAIN=clang ^
        -DANDROID_STL=c++_shared ^
        -DCMAKE_C_FLAGS="%CFLAGS% -Os -Wall -pipe -fPIC" ^
        -DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing ^
        -DANDROID_CPP_FEATURES=rtti exceptions ^
        -DASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT=FALSE ^
        -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=FALSE ^
        -DASSIMP_BUILD_OBJ_IMPORTER=TRUE ^
        -DASSIMP_BUILD_FBX_IMPORTER=FALSE ^
        -DASSIMP_BUILD_SAMPLES=OFF ^
        -DASSIMP_BUILD_TESTS=OFF ^
        -DASSIMP_NO_EXPORT=ON ^
        -DASSIMP_BUILD_ZLIB=ON ^
        -DASSIMP_BUILD_ASSIMP_TOOLS=OFF ^
        -DASSIMP_ANDROID_JNIIOSYSTEM=ON ^
        -DINJECT_DEBUG_POSTFIX=OFF ^
        ../../%SOURCE_DIR%
        
    %CMAKE_PATH%/bin/cmake --build ./
    rem ninja -C .
    rem 需要Ninja install 可以参考《在MSYS2中的脚本》
    @REM %CMAKE_PATH%/bin/ninja clean
    @REM %CMAKE_PATH%/bin/ninja
    %CMAKE_PATH%/bin/ninja install
    cd ../../
            
    echo.[func]-----------------[%1] make end---------------------------
    echo.

endlocal
goto:eof

说明

下载链接:Assimp
脚本中的ANDROID_NDK和CMAKE_PATH路径替换成自己本地对应的路径,call:buildAssimp会执行编译,需要哪些架构就开启那个。
参考:

  1. 模型加载库 Assimp

  2. Assimp Android 编译

  3. 使用Android Studio+CMakeLists编译assimp

  4. Assimp编译实录

注意事项

  1. 编译时报错:Android导入项目报错Error:Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForDebug

    解决方法:

    sourceSets { main { jniLibs.srcDirs = ['src\main\jniLibs'] } }

  2. 运行时报错:dlopen failed: library "libc++_shared.so" not found

    解决方法:在app下的build.gradle中的cmake里面添加 arguments “-DANDROID_STL=c++_shared”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容