EasyAR识别回调使用(jni回调)跟gradle配置

前言

最近项目有个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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值