前言
最近项目有个AR的功能,想集成EasyAR来实现相关功能,因为EasyAR想实现自己的效果是要写部分C++的,然而对于C++或者jni不熟悉的同学呢,那就有些困难了,下面来简单实现一些功能
EasyAR 入门
相关的基本操作官网还是挺详细的了,按照教程配置就可以了
http://www.easyar.cn/view/docs/Getting-Started/Getting-Started-with-EasyAR.html
也有运行的样例和配置的样例
http://www.easyar.cn/view/docs/Getting-Started/Compile-and-Run-EasyAR-Android-Samples.html
http://www.easyar.cn/view/docs/Getting-Started/Setting-up-EasyAR-Android-SDK.html
然后配置一些NDK的开发环境就可以运行了,相关配置可以看我之前的博客在Android Studio中NDK环境配置和Androidstudio中JNI开发初探
你也可以看google android官网的操作https://developer.android.com/studio/projects/add-native-code.html#link-gradle
然后运行demo样例就可以识别图片就会显示相关AR的动画或者啥了
EasyAR相关回调
就是用jni回调C++时的nativeInit加上一个callback回调c++操作之后或者说是识别之后的结果到java层进行再操作
1.首先,建立一个接口ARCallBack
public interface ARCallBack {
void onTrackSuccess(int size);
}
2.然后再activity上实现这个接口,还有初始化到nativeInit方法里面,进行初始回调
这个onInitSuccess方法时进行EasyAR初始后成功的回调方法
3.然后现在来到C++层,也是相对简单吧,这里只是做个记录
这里的callback是用来接收java层的callback方法,在c层进行操作回调给java层
4.然后在c层写回调java的方法,刚刚是初始化时候传进来的callback
这个onInitSuccess方法时对应java层的方法,这里写的作用就是当初始化EasyAR后回调告诉java已经初始化成功了
5.现在才是我们需要回调的重要方法,在EasyAR上最重要就是这个void HelloAR::render方法了,里面有识别图片再进行相关的操作,
demo里面的是当status == AugmentedTarget::kTargetStatusTracked的时候就是识别成功了,然后进行opencv或者opengl的动画操作,
然而可能我们并不需要在c层操作,想回调到java层操作也是可以的,这里我回调了识别到的个数回java层
而里面的onTrackSuccess方法就是我们第一步写的callback接口的方法,这里当识别到图片之后就回调到java层的这个方法再进行操作
然后就是大功告成了
EasyAR的gradle另一种配置,或者说jni的gradle另一种配置
1.这里说一下,根据下载回来的demo中里面是有一个package包的,demo里面也要关联它相关的
这里我直接放到工程的根目录下,再配置一下jni目录下的Android.mk文件的EASYAR_PACKAGE_PATH目录
EASYAR_PACKAGE_PATH := $(LOCAL_PATH_TOP)/../../../../package
还有gradle里面对应相关连的目录也要改一下
2.demo工程里面的gradle用的是
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
对应的gradle-wrapper.properties文件的版本
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip然后gradle的plugin是要用
apply plugin: 'com.android.model.application'然后有一个model包着android{}
model {
android{
......
}
android.buildTypes{
....
}
android.ndk {
.......
}
......
}
然后demo里面的是gradle-experimental:0.4.0跟gradle2.8版本的配置吧
gradle-experimental有很多个版本,都相对应不同的gradle版本,具体请看Androidstudio project site查看相关版本的操作
http://tools.android.com/tech-docs/new-build-system/gradle-experimental
配置可能会出现很多的错误,这里看看这篇博客有一些个别相关的错误解决方法
http://www.cnblogs.com/zhuyp1015/p/4976116.html
3.然后理想跟现实不太一致,可能会出现一些措手不及的错误,比如我要关联google api,
compileSdkVersion 'Google Inc.:Google APIs:17'
下载好相关的版本在gradle是这样配置的,如果按照上面第二点来配置gradle会发现关联不了google api(可能是我不知道怎么配置吧,反正就不成功)
这时候就要用回我们常用的项目的配置gradle方法了,就是不需要gradle-experimental直接配置gradle版本就好了,也不用model{}包着
classpath 'com.android.tools.build:gradle:2.2.3'
然后我贴一下gradle的配置,根据这个配置就可以按照正常的gradle配置方法了,不用再写其他的东西,以前那个就看demo吧
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "cn.easyar.samples.helloar"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cppFlags.add("-I${file("../package/include")}".toString())
cppFlags.add("-DANDROID")
cppFlags.add("-fexceptions")
cppFlags.add("-frtti")
}
}
ndk {
abiFilters "armeabi", "armeabi-v7a"
stl "gnustl_static"
}
}
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file("proguard-rules.pro"))
}
}
productFlavors {
create("arm") {
ndk {
abiFilters "armeabi-v7a"
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: '../package/Android/libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.0'
}
这样就可以按正常的方式使用了
代码可以到github拿来看
https://github.com/ActionPan/HelloARNative