项目是个教学类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);
}
}