Android Visca 协议控制电子云镜(Android ndk)

这篇博客主要介绍了一个教学类TV应用如何使用Android NDK通过Visca协议控制电子云镜的上下左右移动、焦距调整和预制位调用。作者分享了Visca协议的封装过程,使用C++实现,并提供了项目源码链接,旨在帮助不熟悉NDK开发的读者实践JNI代码和C++编程。
摘要由CSDN通过智能技术生成

项目是个教学类TV应用,有一个功能是要控制摄像机的云台控制,就是控制跟踪摄像机的方向(上,下,左,右);
摄像机的焦距(远和近),预制位调用等功能。与跟踪摄像机的通信基于sony 的visca协议,visca协议是我自己封装,用C++代码实现,所以本篇博客主要有两个目的,一方面可以让对不熟悉ndk开发的朋友简单练习写jni代码,C++代码,ndk开发。另一方面 可以用作实际项目中。

项目地址:https://github.com/zxd1991/ViscaAndroid

JNI 接口:

public class ViscaJni {

    static {
        System.loadLibrary("native-lib");
    }

    private static ViscaJni instance;

    public static ViscaJni getInstance() {
        if (instance == null) {
            instance = new ViscaJni();
        }
        return instance;
    }

    /**
     *  connect the camera
     * @param ip camera server ip
     * @param port camera server port
     * @return 0 success,otherwise failure.
     */
    public native int setTraceCameraAddress(String ip,int port);

    /**
     * 控制云台方向位置
     * @param camId 0 means teacher camera,1 means student camera
     * @param dir include left,up,right,bottom
     * @param continuous true means change the pantilt pos continuously
     * @return 0 success,otherwise failure.
     */
    public native int setPantiltPos(int camId, int dir,boolean continuous);

    /**
     *  设置云台方向回到Home位置
     * @param camId int 值,1 为老师,2为学生
     * @return 0 success,otherwise failure.
     */
    public native int setPantiltHome(int camId);

    /**
     * 设置云台速度
     * @param camId int 值,1 为老师,2为学生
     * @param speed
     * @return 0 success,otherwise failure.
     */
    public native int setPantileSpeed(int camId, int speed);

    /**
     * 设置预制位
     * @param camId int 值,1 为老师,2为学生
     * @param channel 预制位
     * @return 0 success,otherwise failure.
     */
    public native int setCamMemory(int camId, int channel);

    /**
     *  调用预制位
     * @param camId int 值,1 为老师,2为学生
     * @param channel 预制位
     * @return  0 success,otherwise failure.
     */
    public native int reCallCamMemory(int camId, int channel);

    /**
     *  设置焦距
     * @param camId int 值,1 为老师,2为学生
     * @param far true 远 false 近
     * @return 0 success,otherwise failure.
     */
    public native int setZoomPosition(int camId,boolean far);

}

c++ 层入口

#include <jni.h>
#include "visca.h"

extern "C" {
JNIEXPORT jint  JNICALL
Java_androidjni_example_com_viscaandroid_ViscaJni_setTraceCameraAddress(JNIEnv *env, jobject,
                                                                        jstring ip, jint port) {
    const char *address = (char *) env->GetStringUTFChars(ip, JNI_FALSE);
    ViscaManager viscaHelper;
    jint result = viscaHelper.connectHostCam(address, port);
    env->ReleaseStringUTFChars(ip, address);
    return result;
}
JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_setPantiltPos
        (JNIEnv *env, jobject jobject, jint camId, jint dir) {
    ViscaManager viscaHelper;
    return viscaHelper.setPantiltPos(camId, dir);
}

JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_setPantiltHome
        (JNIEnv *env, jobject jobject, jint camId) {
    ViscaManager viscaHelper;
    return viscaHelper.setPantiltHome(camId);
}

JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_setPantileSpeed
        (JNIEnv *env, jobject jobject, jint camId, jint speed) {
    ViscaManager viscaHelper;
    return viscaHelper.setPantiltSpeed(camId, speed);
}

JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_setCamMemory
        (JNIEnv *env, jobject jobject, jint camId, jint channel) {
    ViscaManager viscaHelper;
    return viscaHelper.setCamMemory(camId, channel);
}

JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_reCallCamMemory
        (JNIEnv *env, jobject jobject, jint camId, jint channel) {
    ViscaManager viscaHelper;
    return viscaHelper.recallCamMemory(camId, channel);
}
JNIEXPORT jint JNICALL Java_androidjni_example_com_viscaandroid_ViscaJni_setZoomPosition
        (JNIEnv *env, jobject jobject, jint camId, jboolean far) {
    ViscaManager viscaHelper;
    return viscaHelper.setZoomPosition(camId, far);
}

}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值