#include <jni.h>
|
#include <string>
|
|
#include "baresip/BaresipObj.h"
|
|
|
JavaListener *javaListener;
|
BaresipObj *baresipObj;
|
|
JavaVM *jvm;
|
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void *reserved){
|
LOGD("JNI_Onload");
|
jvm =vm;
|
return JNI_VERSION_1_6;
|
}
|
|
|
////
|
extern "C" JNIEXPORT jstring JNICALL
|
Java_lilin_com_MyCApi_stringFromJNI(
|
JNIEnv *env,
|
jobject /* this */) {
|
std::string hello = "Hello from C++1";
|
|
return env->NewStringUTF(hello.c_str());
|
}extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_bareStart(JNIEnv *env, jobject instance) {
|
if( javaListener== nullptr ){
|
javaListener = new JavaListener(jvm,env,env->NewGlobalRef(instance) );
|
}
|
baresipObj = new BaresipObj(javaListener);
|
baresipObj->startbaresip();
|
|
}extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_bareStop(JNIEnv *env, jobject instance) {
|
LOGE("end..");
|
if(baresipObj!= nullptr){
|
baresipObj->stopbaresip();
|
}
|
}
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_barejie(JNIEnv *env, jobject instance) {
|
LOGE("jieting");
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
baresipObj->baresipjie();
|
}
|
}
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_baregua(JNIEnv *env, jobject instance) {
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
baresipObj->baresipgua();
|
}
|
}
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_barecall(JNIEnv *env, jobject instance, jstring num_) {
|
const char *sipadr = env->GetStringUTFChars(num_, 0);
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
int err=baresipObj->baresipcall(sipadr);
|
LOGE("呼叫return=%d",err);
|
}
|
env->ReleaseStringUTFChars(num_, sipadr);
|
}
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_barecallv(JNIEnv *env, jobject instance, jstring num_) {
|
const char *sipadr = env->GetStringUTFChars(num_, 0);
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
int err=baresipObj->baresipcallv(sipadr);
|
LOGE("呼叫vreturn=%d",err);
|
}
|
env->ReleaseStringUTFChars(num_, sipadr);
|
}
|
|
extern "C"
|
JNIEXPORT jint JNICALL
|
Java_lilin_com_MyCApi_bareIsReg(JNIEnv *env, jobject instance) {
|
int state=0;
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
state=baresipObj->bareisreg();
|
}
|
return state;
|
}
|
|
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_baresendvdata(JNIEnv *env, jobject instance, jbyteArray data_,jint w, jint h) {
|
jbyte *bytes = env->GetByteArrayElements(data_, NULL);
|
|
if(baresipObj->frameQueue!=NULL) {
|
|
static int nexttps = 0;
|
AVFrame *avFrame = av_frame_alloc();
|
int picture_size = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, w, h, 1);
|
uint8_t *buffers = (uint8_t *) av_malloc(picture_size);
|
av_image_fill_arrays(avFrame->data, avFrame->linesize, buffers, AV_PIX_FMT_YUV420P, w, h, 1);
|
int size = w * h;
|
memcpy(avFrame->data[0], bytes, size); //Y
|
for (int j = 0; j < size / 4; j++) {
|
*(avFrame->data[2] + j) = *(bytes + size + j * 2); // V
|
*(avFrame->data[1] + j) = *(bytes + size + j * 2 + 1); //U
|
}
|
//raote
|
avFrame->format = AV_PIX_FMT_YUV420P;
|
avFrame->width=w;avFrame->height=h;
|
if (nexttps == 0) { avFrame->pts = 0; }
|
else {
|
avFrame->pts = nexttps;
|
}
|
nexttps = avFrame->pts + 1000000LL * 1 / 25;
|
{
|
AVRational base;
|
base.num = 1;
|
base.den = 1000000LL;//帧率
|
AVRational base1;
|
base1.num = 1;
|
base1.den = 25;//帧率
|
//转换回去去压缩器的时基
|
avFrame->pts = av_rescale_q(avFrame->pts, base, base1);
|
}
|
|
//LOGE("====%lld", avFrame->pts);
|
baresipObj->frameQueue->putAvFrame(avFrame);
|
}
|
env->ReleaseByteArrayElements(data_, bytes, 0);
|
}
|
|
extern "C"
|
JNIEXPORT void JNICALL
|
Java_lilin_com_MyCApi_barereg(JNIEnv *env, jobject instance, jstring sipaddress_) {
|
const char *sipaddress = env->GetStringUTFChars(sipaddress_, 0);
|
if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
|
baresipObj->baresipreg( sipaddress );
|
}
|
env->ReleaseStringUTFChars(sipaddress_, sipaddress);
|
}
|