公司要预研AR方面的技术,就试试研究artoolkit,网上都是关于编译artoolkit5的例子,artoolkit5已经很久没更新了,而artoolkitx是最新版的,可是没找到关于编译artoolkitx的方法,就试着自己编译试试
先说环境:Windows10,Android Studio3.5.3,artoolkitx1.0.6,ndkr20b
首先先下载artoolkitx
再自己创建个新的项目
在新建的项目里新建个module
选Android Library
module名填arxj,包名填org.artoolkitx.arx.arxj
在app的build.gradle的dependencies{}内
implementation project(path: ':arxj')
进入下载下来的artoolkitx源码内的Source文件夹内,把除ARXJ文件夹以外的所有文件夹和文件全都复制到刚才创建的arxj的cpp文件夹下,没有自己创建一个
修改arxj的build.gradle,在android{}内添加关联CMakeLists.txt代码
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
再在defaultConfig{}添加代码
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared", "-DANDROID_CPP_FEATURES=rtti exceptions"
cppFlags"-std=c++11"
}
}
Run 'app'一下,等了半天报错
Build command failed.
Error while executing process x:\xxx\xxx\cmake\3.6.4111459\bin\cmake.exe with arguments {--build x:\xxxx\xxxx\AndroidArtoolkitx\arxj\.cxx\cmake\debug\arm64-v8a --target ARX}
拉到下边看到报错代码
点进去,原来是找不到arRefineCorners函数
再点进arRefineCorners.h发现是#if HAVE_OPENCV判断隐藏了
通过#if HAVE_OPENCV来判断当前是否用了opencv,如果没有就隐藏了,可是arDetectMarker.c里没有进行opencv判断,然后在arRefineCorners.cpp发现也有opencv判断
那arRefineCorners.h里判断opencv的意义其实不大,两种方法,一种直接删除报错代码,一种就是在arRefineCorners.h内不进行opencv判断,我选择了后一种,把#if HAVE_OPENCV注释掉
//#if HAVE_OPENCV
#ifdef __cplusplus
extern "C" {
#endif
// Given corner locations 'vertex' in observed coordinates, refine location.
// buff is a luma-only buffer of dimensions width x height.
void arRefineCorners(float vertex[4][2], const unsigned char *buff, int width, int height);
#ifdef __cplusplus
}
#endif
//#endif // HAVE_OPENCV
再Run 'app'一下,继续报错
x:\xxx\xxx\AndroidArtoolkitx\arxj\src\main\cpp\ARX\ARUtil/nftw.c:123: error: undefined reference to 'fts_close'
点开报错文件,原来是给低SDK版本系统用的代码报错,可能是我的ndk版本太高了吧,不想一个一个版本的试,那就直接注释掉,把最低SDK版本设置成21
再Run 'app'一下,运行成功,到这编译就成功了,然后把demo里的arxj的java代码复制到自己的arxj内
再然后呢就是把res文件夹内的文件或文件夹复制到自己的arxj的res内
之后是运行demo了,demo在源码的Examples文件夹内,我测试了下发现2d tracking example这个运行不了,因为这个demo有用到opencv,我没用opencv,所以就用Square tracking example进行测试
把Square tracking example的assets文件夹,java代码,layout布局都复制到自己的项目的相应位置,还要把Source/etc/android下的cparam_cache文件夹复制到assets文件夹
最后修改AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature android:name="android.hardware.camera.any" />
<uses-feature android:name="android.hardware.camera"
android:required="true" />
<uses-feature android:name="android.hardware.camera2"
android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<application
android:name="org.artoolkitx.arx.arsquaretracking.ARSquareTrackingApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="org.artoolkitx.arx.arsquaretracking.ARSquareTrackingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="org.artoolkitx.arx.arxj.camera.CameraPreferencesActivity"/>
</application>
测试图片都在Documentation/Square marker pattern images文件夹下的pdf
启动很慢,默认横屏,代码还要研究,应该可以优化
2020/5/11更新
加入了3d模型,优化了启动慢