easyar 识别成功后,怎么回调java层代码

本文介绍如何在 EasyAR SDK 中实现 AR 目标识别成功后的 Java 层回调,包括修改 Renderer.java 和 MainActivity.java 文件,以及在 C 层代码中调用 Java 方法的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

easyar是国内开发的一款ar技术sdk,最近开发时遇到问题--- easyar 识别成功后,怎么回调java层代码(其实回调方法sdk应该给出,现在没有只能自己写了)?

很简单,改几个地方就行了

在Renderer.java 

public void onDrawFrame(GL10 gl) {
    MainActivity.nativeRender(this);
}

//此方法用来c层回调,输出c代码层的信息
public void output(String out) {
    Log.i("zdbb""zdbb.. c代码回调: " + out);
}


MainAtivity.java
public static native void nativeRender(Object obj);


helloar.cc  (红色字体为关键)

extern "C" {
    
JNIEXPORT jboolean JNICALL JNIFUNCTION_NATIVE(nativeInit(JNIEnv* envjobject object));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeDestory(JNIEnv* envjobject object));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeInitGL(JNIEnv* envjobject object));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeResizeGL(JNIEnv* envjobject objectjint wjint h));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeRender(JNIEnv* envjobject obj, jobject log));
    JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeRotationChange(JNIEnv* env, jobject obj, jboolean portrait));
};


JNIEXPORT void JNICALL JNIFUNCTION_NATIVE(nativeRender(JNIEnv* envjobject obj, jobject log))
{
    ar.render( 
env,  log);
}

void HelloARVideo::render(JNIEnv* env, jobject obj)
{
    glClearColor(
0.f0.f0.f1.f);
    glClear(GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT);

    Frame frame = augmenter_.newFrame();
    if(view_size[00){
        
AR::resizeGL(view_size[0view_size[1);
        if(camera_ && camera_.isOpened())
            
view_size[0= -1;
    }
    
augmenter_.setViewPort(viewport_);
    augmenter_.drawVideoBackground();
    glViewport(viewport_[0viewport_[1viewport_[2viewport_[3);

    AugmentedTarget::Status status = frame.targets()[0.status();
    if(status == AugmentedTarget::kTargetStatusTracked){
        
int id = frame.targets()[0.target().id();

        std::string idStr = frame.targets()[0.target().uid();
        if(active_target && active_target != id) {
            
video->onLost();
            delete video;
            video NULL;
            tracked_target 0;
            active_target 0;
        }
        
if (!tracked_target) {
/*
*          回调java代码
*/            jclass cls = env->GetObjectClass(obj);
            jmethodID jmid = env->GetMethodID(cls, "output", "(Ljava/lang/String;)V");
            jstring info = env->NewStringUTF("你的选择没有错,我欠你的太多 ! ! ! ");
            env->CallVoidMethod(obj, jmid,info);
            jboolean  *jboolean1 = new jboolean(false);
            env->ReleaseStringUTFChars(info,env->GetStringUTFChars( info,jboolean1));

            if (video == NULL) {
                
if(frame.targets()[0.target().name() == std::string("argame") && texid[0]) {
                    
video new ARVideo;
                    video->openVideoFile("video.mp4"texid[0]);
                    video_renderer renderer[0;
                }
                
else if(frame.targets()[0.target().name() == std::string("namecard") && texid[1]) {
                    
video new ARVideo;
                    video->openTransparentVideoFile("transparentvideo.mp4"texid[1]);
                    video_renderer renderer[1;
                }
                
else if(frame.targets()[0.target().name() == std::string("idback") && texid[2]) {
                    
video new ARVideo;
                    video->openStreamingVideo("http://m21.oss-cn-qingdao.aliyuncs.com/1494836612692.mp4",texid[2]);
                    video_renderer renderer[2;
                }

            }
            
if (video) {
                
video->onFound();
                tracked_target = id;
                active_target = id;
            }


        }
        
Matrix44F projectionMatrix = getProjectionGL(camera_.cameraCalibration()0.2f500.f);
        Matrix44F cameraview = getPoseGL(frame.targets()[0.pose());
        ImageTarget target = frame.targets()[0.target().cast_dynamic<ImageTarget>();
        if(tracked_target) {
            
video->update();
            video_renderer->render(projectionMatrixcameraviewtarget.size());
        }
    } 
else {
        
if (tracked_target) {
            
video->onLost();
            tracked_target 0;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值