基于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 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- java虚拟机学习-JVM调优总结-基本垃圾回收算法(7)
可以从不同的的角度去划分垃圾回收算法: 1.按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计 ...
- R语言-混合型数据聚类
利用聚类分析,我们可以很容易地看清数据集中样本的分布情况.以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量.名义型变量和顺序型变量 ...
- R语言的高质量图形渲染库Cairo(转)
前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...
- mysql5.6创建新用户并给授权指定的数据库权限
一.环境: CentOS 6.8 mysql 5.6 二.背景 给外包的工作人员提供我司某台服务器的 mysql 中某个数据库的访问权限. 之所以要做限制,是防止他们对我司其他的数据库非法进行操作. ...
- Spring Boot 学习(3)
文 by / 林本托 Tips 做一个终身学习的人. Tips 代码路径:https://github.com/iqcz/Springbootdemo/tree/master/code01/ch3 W ...
- 谷歌安装器扫描时提示“需要root权限”,不用root也可以的!
能FQ的用户会用谷歌服务,一般的新手机没有安装谷歌框架,但是在用谷歌安装器安装谷歌市场时会提示"需要root权限",我用的是360手机,按照下面的教程搞好了: 安装完GSM包就可以 ...
- 从零开始——PowerShell应用入门(全例子入门讲解)
学习一门技术,不止要会,还要善用,例子就是带你快速入门的最佳利器.本文就是要用例子,不,大量的例子来带你走进PowerShell应用世界. 本文主要介绍一些PowerShell入门的基础知识,对技术小 ...
- 30多个Android 开发者工具 带你开发带你飞
文中部分工具是收费的,但是绝大多数都是免费的. FlowUp 这是一个帮助你跟踪app整体性能的工具,深入分析关键的性能数据如FPS, 内存, CPU, 磁盘, 等等.FlowUp根据用户数量收费. ...
- cordova 插件开发
从事基于cordova开发混合APP也快一年了,一直没有自己"亲自操刀"写一个插件,因为网上插件太丰富了,可耻了. 今天完整的记录一次插件开发. cordova环境6.4.0 第一 ...
- [0] 错误1“GenerateResource”任务意外失败。....
解决方案1:关闭VS,删除目录下DEBUG文件夹下所有文件,打开VS重新编译.