先說環境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
最後效果