基于PlatinumKit库的DLNA服务端开发
首先,需要特别感谢蓝斯老师的资料,我这里有很大一部分是参考蓝斯老师的,附上传送门:http://blog.csdn.net/lancees/article/details/9178385

图1
PltMediaRendererDelegate *mediaRenderDelegate;
PLT_MediaRenderer *mediaRenderer;
PLT_DeviceHostReference device;
PLT_UPnP upnp;
JNIEXPORT jint JNICALL Java_com_pngcui_skyworth_dlna_jni_PlatinumJniProxy_startDlnaMediaRender
(JNIEnv *env, jclass, jbyteArray name, jbyteArray uuid)
{
;
jbyte *bytes;
char *c_name = ConvertJByteaArrayToChars(env, name, bytes);
jbyte *bytes2;
char *c_uuid = ConvertJByteaArrayToChars(env, uuid, bytes2);
LOGI("name = %s,uuid = %s",c_name,c_uuid);
if(mediaRenderDelegate == NULL)
mediaRenderDelegate = new PltMediaRendererDelegate();
mediaRenderer= new PLT_MediaRenderer(c_name,false,c_uuid);
mediaRenderer->SetDelegate(mediaRenderDelegate);
PLT_DeviceHostReference device1(mediaRenderer);
device = device1;
upnp.AddDevice(device);
ret = upnp.Start();
env->ReleaseByteArrayElements(name, bytes, JNI_ABORT);
env->ReleaseByteArrayElements(uuid, bytes2, JNI_ABORT);
delete c_name;
delete c_uuid;
return ret;
}
NPT_Result
PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
const PLT_HttpRequestContext& context)
{
NPT_COMPILER_UNUSED(context);
/* parse the action name */
NPT_String name = action->GetActionDesc().GetName();
LOGI("OnAction -> %s",name.GetChars());
...
) {
return OnPlay(action);
}
...
return NPT_FAILURE;
}
NPT_Result
PLT_MediaRenderer::OnPlay(PLT_ActionReference& action)
{
if (m_Delegate) {
return m_Delegate->OnPlay(action);
}
return NPT_ERROR_NOT_IMPLEMENTED;
}
NPT_Result
PltMediaRendererDelegate::OnPlay(PLT_ActionReference& action)
{
LOGI("OnPlay");
NPT_String curURI;
action->GetArgumentValue("CurrentURI", curURI);
NPT_String metaData ;
action->GetArgumentValue("CurrentURIMetaData", metaData);
ActionInflect(MEDIA_RENDER_CTL_MSG_PLAY, curURI.GetChars(),metaData.GetChars());
return NPT_SUCCESS;
}
void PltMediaRendererDelegate::ActionInflect(int cmd, const char* value, const char* data)
{
int status;
JNIEnv *env = NULL;
bool isAttach = false;
if(g_vm == NULL)
LOGI("g_vm == NULL");
status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_4);
)
{
status = g_vm->AttachCurrentThread(&env, NULL);
LOGI("status = %d",status);
) {
LOGI("callback_handler: failed to attach , current thread, status = %d", status);
return;
}
isAttach = true;
}
jstring valueString = NULL;
jstring dataString = NULL;
jclass inflectClass = g_inflectClass;
if (inflectClass == NULL)
{
LOGI("inflectClass == NULL return");
}
jmethodID inflectMethod = g_methodID;
if (inflectMethod == NULL)
{
LOGI("inflectMethod == NULL return");
}
if (inflectClass == NULL || inflectMethod == NULL)
{
LOGI("goto end");
goto end;
}
LOGI("CMD = %d VALUE = %s DATA = %s",cmd, value, data);
valueString = env->NewStringUTF(value);
dataString = env->NewStringUTF(data);
env->CallStaticVoidMethod(inflectClass, inflectMethod, cmd, valueString, dataString);
env->DeleteLocalRef(valueString);
env->DeleteLocalRef(dataString);
end:
if (env->ExceptionOccurred())
{
LOGI("clear...");
env->ExceptionDescribe();
env->ExceptionClear();
}
if (isAttach)
{
g_vm->DetachCurrentThread();
}
}
注:Android6.0以上版本无法使用 env->CallStaticVoidMethod进行反射,因为google官方对jvm进行了一些列的优化
void InitInflectClass(JavaVM* vm)
{
g_vm = vm;
JNIEnv *env = NULL;
int status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_4);
)
{
return ;
}
jclass inflectClass = env->FindClass("com/pngcui/skyworth/dlna/jni/PlatinumReflection");
if (inflectClass == NULL)
{
LOGI("inflectClass == NULL return");
return ;
}
g_inflectClass = (jclass)env->NewGlobalRef(inflectClass);
jmethodID methodID = env->GetStaticMethodID(inflectClass, "onActionReflection", "(ILjava/lang/String;Ljava/lang/String;)V");
if (methodID == NULL)
{
LOGI("methodID == NULL return");
return ;
}
g_methodID = methodID;
return ;
}
/*
* Class: com_pngcui_skyworth_dlna_jni_PlatinumJniProxy
* Method: responseGenaEvent
* Signature: (J)I
*/
JNIEXPORT jboolean JNICALL Java_com_pngcui_skyworth_dlna_jni_PlatinumJniProxy_responseGenaEvent
(JNIEnv *env, jclass, jint cmd, jbyteArray value, jbyteArray data)
{
// NPT_LOG_INFO("response");
jbyte *bytes;
char *c_value = ConvertJByteaArrayToChars(env, value, bytes);
jbyte *bytes2;
char *c_data = ConvertJByteaArrayToChars(env, data, bytes2);
LOGI("ResponseGenaEvent value = %s data = %s",c_value,c_data);
mediaRenderer->UpdateServices(c_value,c_data);
env->ReleaseByteArrayElements(value, bytes, JNI_ABORT);
env->ReleaseByteArrayElements(data, bytes2, JNI_ABORT);
delete c_value;
delete c_data;
return true;
}
NPT_Result
PLT_MediaRenderer::UpdateServices(const char* value,const char* data)
{
PLT_Service* serviceUpdate;
if(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceUpdate) == NPT_ERROR_NO_SUCH_ITEM){
LOGI("cant find PLT_Service.....");
return NPT_FAILURE;
}
) == ) == ':')
{
) == 'd')
{
serviceUpdate->SetStateVariable("CurrentTrackDuration", value);
serviceUpdate->SetStateVariable("CurrentMediaDuration", value);
}
else
{
serviceUpdate->SetStateVariable("RelativeTimePosition", value);
serviceUpdate->SetStateVariable("AbsoluteTimePosition", value);
}
}
else
{
serviceUpdate->SetStateVariable("TransportState", value);
}
return NPT_SUCCESS;
}
NPT_Result
PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
const PLT_HttpRequestContext& context)
{
...
// other actions rely on state variables
NPT_CHECK_LABEL_WARNING(action->SetArgumentsOutFromStateVariable(), failure);
return NPT_SUCCESS;
failure:
action->SetError(,"No Such Action.");
return NPT_FAILURE;
}
接下来就是APP播放的实现了,可参考蓝斯老师的博客:http://blog.csdn.net/lancees/article/details/8951679
基于PlatinumKit库的DLNA服务端开发的更多相关文章
- 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice
一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...
- Day01_搭建环境&CMS服务端开发
学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- Swift3.0服务端开发(三) Mustache页面模板与日志记录
本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- WCF服务端开发和客户端引用小结
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
- 从架构师视角看是否该用Kotlin做服务端开发?
前言 自从Oracle收购Sun之后,对Java收费或加强控制的尝试从未间断,谷歌与Oracle围绕Java API的官司也跌宕起伏.虽然Oracle只是针对Oracle JDK8的升级收费,并释放了 ...
- 微服务项目开发学成在线_day01_CMS服务端开发
05-CMS需求分析-什么是CMS 什么是CMS?CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同.CMS有哪些类型? 每个公司对每个项目的C ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- wampServer 2.5 64位 更改"www 目录"不成功
已经指到自己新目录了,修改了 apache的httpd.conf里面的内容如下 修改: DocumentRoot "e:/phproot/" 修改: <Directory & ...
- 移动端设置fixed布局的问题解决
最近写移动端,遇到一个问题就是用fixed属性布局的时候由于手机的原因会出现很多问题,比如说手机端底部固定一块,然后里面有输入框,(类似于手机QQ或者微信底部的输入框一样的布局)这个时候在调用软键盘的 ...
- 一篇文章介绍GItHub的基础使用
最近复习了一下Git的使用,简单总结了一些.以供以后查阅和同行参考. 一,安装 首先是Linux下: 打开shell ,输入 sudo apt-get install git-core 之后回车输入密 ...
- openjdk7之编译和debug
大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...
- Redis 集群搭建详细指南
先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...
- C# 中文在URL中的编码
UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节. 不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节. //按照UTF-8进行编码 string tempSearc ...
- Context源码分析
我们做安卓开发,时时都在和Context打交道,那么Context到底是什么?有什么作用?如何与Application,Activity,Service等实例发生联系的?等等 Context是什么? ...
- python socketserver监听多端口多进程
多进程监听多端口 # 多线程socket # 程序监听两个端口,端口逻辑相同其中一个端口放在子进程下 # 每次请求会在产生一个进程处理请求 import SocketServer from multi ...
- cpu-z如何查看电脑配置数据方法介绍
CPU-Z是款经典的内存检测工具,具有5大功能,使用CPU-Z可以查询电脑的处理器.缓存.主板.内存.显卡以及SPD的信息.但是怎么具体看哪一个项目呢?在今天的教程中,小编就跟大家分享一下cpu-z ...
- Replication-删除发布备注
1.删除replication,先删除replication的作业,再删除对应的订阅,再删除发布: 2.相关脚本:删除监视器里不存在的条目sp_removedistpublisherdbreplica ...