使用Android Studio+CMakeLists編譯assimp

先說環境win10,android studio3.5.3,ndk-r18b,assimp-4.1.0

爲啥是assimp-4.1.0,因爲最開始去網上找例子的時候是4.1.0版本,就沒改了,我想5.0.1也差不多,只是我只編譯成功了arm64-v8a的,其他的編譯失敗了,也不知道是不是參數不對,先這樣吧。關於ndk最低版本我沒測試,我試過幾個版本都沒問題,r18b是我最開始用的就沒改

首先創建個項目,選c++項目

我創建的項目的CMakeLists.txt文件默認在cpp文件夾下,如果不同根據自己的情況進行修改

下載assimp-4.1.0,再下載AssimpAndroid的代碼,AssimpAndroid是一個顯示模型的demo,我還不太會assimp,所以先用別人的代碼來測試

將assimp-4.1.0整個文件夾複製到cpp文件夾下,修改文件夾名

將AssimpAndroid\app\src\main\externals\glm-0.9.7.5\內的glm整個文件夾複製到cpp文件夾下

在cpp的CMakeLists.txt內添加代碼

aux_source_directory (${CMAKE_SOURCE_DIR}/glm/ GLM)
aux_source_directory (${GLM}/gtc GTC)
aux_source_directory (${GLM}/gtx GTX)
aux_source_directory (${GLM}/detail DETAIL)

target_include_directories(native-lib PRIVATE ${GLM} ${GTC} ${DETAIL} ${GTX})

Ran'app'一下,就是跑一下app,沒報錯,繼續

再在cpp的CMakeLists.txt內添加代碼

add_subdirectory(${CMAKE_SOURCE_DIR}/Assimp)
include_directories(${CMAKE_SOURCE_DIR}/Assimp/include)
set(ATLAS_ENGINE_LIBS assimp)
set(ATLAS_ENGINE_SYSTEM_LIBS android EGL GLESv2 GLESv3 m)


target_link_libraries(
                       native-lib
                       ${ATLAS_ENGINE_LIBS}
                       ${ATLAS_ENGINE_SYSTEM_LIBS}
                       ${log-lib} )

再Ran'app'一下,嗯,報錯了

Error while executing process X:\sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C Y:\hyq\TestAssimp\app\.cxx\cmake\debug\arm64-v8a assimp assimp_cmd native-lib unit}

也不知道是啥錯誤,只看到了'arm64-v8a',然後我在build.gradle的defaultConfig內添加了

ndk{
            abiFilters 'arm64-v8a'
        }

還是報錯,對ndk實在是太不熟悉了,東找找西找找碰運氣把其他demo裏的東西複製到build.gradle居然成功了

externalNativeBuild {
            cmake {
                arguments '-DASSIMP_BUILD_ZLIB=ON', '-DASSIMP_BUILD_TESTS=OFF',
                        '-DASSIMP_NO_EXPORT=ON', '-DASSIMP_BUILD_ASSIMP_TOOLS=OFF',
                        '-DANDROID_ARM_NEON=TRUE', '-DCMAKE_BUILD_TYPE=Release'
                cppFlags "-fexceptions -frtti -std=c++11 -O3"
            }
        }
        ndk{
            abiFilters 'arm64-v8a'
        }

Ran'app'一下,不報錯,那就繼續,在native-lib.cpp內添加代碼

#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

Ran'app'一下,報錯,還是上邊的那個錯誤,不過把錯誤拉到最底下看到一條

fatal error: 'assimp/config.h' file not found

在Assimp/include/assimp文件夾內確實沒有config.h文件,但是在app/.cxx/cmake/debug/arm64-v8a/Assimp/include/assimp文件夾內有複製到Assimp/include/assimp內,Ran'app'一下,成功,自此Assimp已經編譯成功了,現在要試着運行demo了

AssimpAndroid這個demo有用到opencv,只是用到opencv的讀取圖片功能,可以自己試着去掉,我爲了方便就加上了opencv

複製opencv的libopencv_java3.so到app/libs/arm64-v8a文件夾下,沒有arm64-v8a文件夾自己創建,複製opencv的include到app/src/main/cpp/opencv文件夾下,沒有opencv文件夾自己創建,在CMakeLists.txt內添加代碼

include_directories(${CMAKE_SOURCE_DIR}/Assimp/include ${CMAKE_SOURCE_DIR}/opencv/include)
set(distribution_DIR ../../../../libs)
add_library(opencv_java3 SHARED IMPORTED )
set_target_properties(opencv_java3
        PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/${ANDROID_ABI}/libopencv_java3.so
        )
target_link_libraries(
                       native-lib
                       opencv_java3
                       ${ATLAS_ENGINE_LIBS}
                       ${ATLAS_ENGINE_SYSTEM_LIBS}
                       ${log-lib} )

再在build.gradle的defaultConfig內添加

sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

複製AssimpAndroid/app/src/main/jni文件夾下的jniCalls文件夾和nativeCode文件夾,在CMakeLists.txt內添加代碼

add_library(
        native-lib
        SHARED
        native-lib.cpp
        jniCalls/assimpActivity.cpp
        jniCalls/gestureClass.cpp
        jniCalls/myGLRenderer.cpp
        nativeCode/common/assimpLoader.cpp
        nativeCode/common/assimpLoader.h
        nativeCode/common/misc.cpp
        nativeCode/common/misc.h
        nativeCode/common/myGLCamera.cpp
        nativeCode/common/myGLCamera.h
        nativeCode/common/myGLFunctions.cpp
        nativeCode/common/myGLFunctions.h
        nativeCode/common/myGLM.h
        nativeCode/common/myJNIHelper.cpp
        nativeCode/common/myJNIHelper.h
        nativeCode/common/myLogger.h
        nativeCode/common/myShader.cpp
        nativeCode/common/myShader.h
        nativeCode/modelAssimp/modelAssimp.cpp
        nativeCode/modelAssimp/modelAssimp.h
        )

Ran'app'一下,報錯

fatal error: 'modelAssimp.h' file not found

打開modelAssimp.h,右上角有個Sync Now,點擊

再修改#include的路徑,先修改myGLM.h的

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/quaternion.hpp>
#include <glm/gtx/quaternion.hpp>

改成

#include <../../glm/glm.hpp>
#include <../../glm/gtc/matrix_transform.hpp>
#include <../../glm/gtc/quaternion.hpp>
#include <../../glm/gtx/quaternion.hpp>

 這個問題應該是native-lib.cpp是主體,所以其他文件夾下的引入要進行文件夾跳轉吧,jni半路出家,腦殼疼

#include "modelAssimp.h"
#include "myJNIHelper.h"

改成

#include "../nativeCode/modelAssimp/modelAssimp.h"
#include "../nativeCode/common/myJNIHelper.h"

路徑要一個一個改成對應的文件夾,就不多說了

fatal error: 'gl3stub.h' file not found

把#include "gl3stub.h"刪掉,再把myGLFunctions.cpp內的&& gl3stubInit()刪掉,這段if內的代碼是判讀opengles版本的,gl3stub.h也就這裏用了下,也不知道是gl3stub.h是哪個庫的

implicit instantiation of undefined template 'std::__ndk1::vector<MeshInfo, std::__ndk1::allocator<MeshInfo> >'

添加#include <vector>

複製AssimpAndroid的Java代碼到項目,複製assimp_layout.xml到layout文件夾,複製assets到項目,由於我的項目是androidx的所以要把android.support.v4.view改成androidx,最後把AndroidManifest.xml的.MainActivity改成com.anandmuralidhar.assimpandroid.AssimpActivity,記得把AssimpActivity的System.loadLibrary改成自己的庫,我的是native-lib

最後效果

GitHub

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章